JPanel을 헤드리스 모드로 BufferedImage에 페인트하고 싶습니다 (화면에 GUI가 전혀 표시되지 않음).헤드리스 페인팅
final JPanel panel = createPanel();
panel.setSize(panel.getPreferredSize());
panel.validate();
// JFrame frame = new JFrame();
// frame.getContentPane().add(panel);
// frame.pack();
// frame.setVisible(true);
final BufferedImage image = new BufferedImage(
panel.getBounds().width,
panel.getBounds().height,
BufferedImage.TYPE_INT_ARGB
);
final Graphics2D gc = image.createGraphics();
gc.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
try {
panel.paint(gc);
...save the image somewhere...
} finally {
gc.dispose();
}
하지만 항상 내가 무거운 중량의 구성 요소에 패널을 넣을 때까지 빈 이미지를 얻을이 화면에 표시 (주석 코드 참조). 나는 그것을 보여주고 싶지 않습니다,이 응용 프로그램은 서버에서 실행됩니다. 여기
는 SSCCE입니다 :public class Example {
private static JPanel createPanel() {
final JPanel panel = new JPanel(new GridBagLayout());
final JLabel label = new JLabel("Yeah, it's working!", SwingConstants.CENTER);
label.setFont(new Font("Arial", Font.PLAIN, 12));
final GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1;
constraints.weightx = 1;
panel.add(label, constraints);
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JPanel panel = createPanel();
panel.setSize(panel.getPreferredSize());
panel.validate();
// JFrame frame = new JFrame();
// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.getContentPane().add(panel);
// frame.pack();
// frame.setVisible(true);
final BufferedImage image = new BufferedImage(
panel.getBounds().width,
panel.getBounds().height,
BufferedImage.TYPE_INT_ARGB
);
final Graphics2D gc = image.createGraphics();
gc.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
try {
panel.paint(gc);
ImageIO.write(image, "png", new File("image.png"));
} catch (IOException e) {
e.printStackTrace();
} finally {
gc.dispose();
}
}
});
}
}
Linux에서이 작업을 수행하는 전통적인 방법은 실제로 아무 것도 표시하지 않는 "가짜"X-Window 제공자를 실행하는 것입니다. 그러나 Java를 행복하게 유지합니다. –
더 나은 도움을 받으려면 [SSCCE] (http://sscce.org) –
[[JTable 헤더가 이미지에 나타나지 않는 이유는 무엇입니까?] (http://stackoverflow.com/q/7369814/418556)를 참조하십시오. 실현되지 않은 구성 요소를 페인팅하는 방법에 대한 정보는 이를 토대로 작동시키지 못한다면 @GuillaumePolet의 조언에 따라 SSCCE를 게시하십시오. –