2014-06-26 12 views
5

Ho un JPanel che include uno JComboBox. Sto cercando di fare uno screenshot di questo pannello quando JComboBox è aperto. Ma non potevo farlo. Qualche idea?Screenshot di un pannello con caselle combinate aperte

Se si esegue questo codice, premere Alt-P quando la combo è aperta, verrà visualizzato il problema.

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

ore Sì, è un problema che ho speso, una domanda importante. – benchpresser

risposta

5

la finestra a comparsa discesa non fa parte della gerarchia dei componenti del JComboBox, e, pertanto, non viene disegnato come parte di essa, ma in modo indipendente.

Una soluzione a questo è quello di prendere un colpo di schermo reale utilizzando 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

soluzione eccellente – bahtiyartan

2
  • tutti Popup s in AWT/Swing sono Heavyweight di default (eventuali modifiche al già comparsa visibile devono essere pack () 'ndr)

  • qui non è necessario per utilizzare awt.Robot per screenshot, hanno per ottenere top componente dei pesi massimi nel gerarchia pesante BasicsComboBoxPopup, questo è RootPane da JFrame

esempio

enter image description here

.

enter image description here

dal codice

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(); 
      } 
     }); 
    } 
} 
Problemi correlati