2014-06-26 14 views
5

Mam JPanel, który zawiera . Próbuję zrobić zrzut ekranu tego panelu po otwarciu JComboBox. Ale nie mogłem tego zrobić. Dowolny pomysł?Zrzut ekranu panelu z otwartymi comboboxami

Jeśli uruchomisz ten kod, naciśnij Alt-P kiedy kombi jest otwarte, zobaczysz problem.

public class ScreenShotDemo { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     final JPanel JMainPanel = new JPanel(new BorderLayout()); 

     JPanel jp = new JPanel(); 
     jp.add(new JComboBox<String>(new String[] { "Item1", "Item2", "Item3" })); 

     final JPanel jImage = new JPanel(); 

     JMainPanel.add(jp, BorderLayout.WEST); 
     JMainPanel.add(jImage, BorderLayout.CENTER); 

     jp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.ALT_DOWN_MASK), "screenshot"); 
     jp.getActionMap().put("screenshot", new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       BufferedImage bf = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB); 
       JMainPanel.paint(bf.getGraphics()); 
       jImage.getGraphics().drawImage(bf, 0,0,jImage); 
      } 
     }); 

     final JFrame jf = new JFrame(); 
     jf.getContentPane().add(JMainPanel); 
     jf.setSize(500, 500); 
     jf.setVisible(true); 
    } 
} 
+0

tak to jest problem Spędziłem godziny, ważne pytanie. – benchpresser

Odpowiedz

5

Oknie rozwijana nie stanowi części składowej hierarchii JComboBox, a zatem nie jest narysowany jako jego części, ale niezależnie.

Rozwiązaniem tego problemu jest podjęcie rzeczywistej zrzut ekranu przy użyciu java.awt.Robot:

@Override 
public void actionPerformed (ActionEvent arg0) { 

    Point p = new Point(0, 0); 
    SwingUtilities.convertPointToScreen(p, JMainPanel); 
    Rectangle screenBounds = new Rectangle(p.x, p.y, JMainPanel.getSize().width, JMainPanel.getSize().height); 

    try { 
     Robot robot = new Robot(); 
     BufferedImage screenCapture = robot.createScreenCapture(screenBounds); 

     jImage.getGraphics().drawImage(screenCapture, 0, 0, jImage); 
    } catch (AWTException e) { 
     e.printStackTrace(); 
    } 
} 
+0

doskonałe rozwiązanie – bahtiyartan

2
  • wszystkie Popup s w AWT/Swing są Heavyweight domyślnie (wszelkie zmiany do już widoczne okienko musi być paczka () "ed)

  • tutaj nie jest wymagane do korzystania awt.Robot na zrzucie ekranu, trzeba uzyskać najwyższej wagi ciężkiej składnik w hierarchii dla ciężkiego BasicsComboBoxPopup, to RootPane z JFrame

np.

enter image description here

.

enter image description here

z kodu

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.InputEvent; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.AbstractAction; 
import javax.swing.JComboBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

public class ScreenShotDemo { 

    private JPanel JMainPanel = new JPanel(new BorderLayout()); 
    private JPanel jp = new JPanel(); 
    private JComboBox combo = new JComboBox(new String[]{"Item1", "Item2", "Item3"}); 
    private JPanel jImage = new JPanel(); 
    private JFrame jf = new JFrame(); 

    public ScreenShotDemo() { 
     jp.add(combo); 
     JMainPanel.add(jp, BorderLayout.WEST); 
     JMainPanel.add(jImage, BorderLayout.CENTER); 
     jp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
       KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.ALT_DOWN_MASK), "screenshot"); 
     jp.getActionMap().put("screenshot", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       final BufferedImage bf = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB); 
       javax.swing.SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         jf.getRootPane().paint(bf.getGraphics()); 
         jImage.getGraphics().drawImage(bf, 0, 0, jImage); 
        } 
       }); 
      } 
     }); 
     jf.getContentPane().add(JMainPanel); 
     jf.setSize(500, 500); 
     jf.setVisible(true); 
    } 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ScreenShotDemo(); 
      } 
     }); 
    } 
}