У меня есть JLayeredPane
, который содержит Canvas
на уровне 0 (заполняется желтым цветом в методе Paint
) и JPanel
на уровне 1 (устанавливает его фон красным в конструкторе).
При нажатии кнопки в методе paintAllToImage
я создаю BufferedImage
и рисую JLayerePane
на этом изображении с помощью component.paintAll(image.getGraphics());
Проблема в том, что на этом изображении окрашено только Canvas
(оно полностью заполнено желтым цветом). Пожалуйста, смотрите прикрепленное изображение.
(часть над кнопкой — это то, что на самом деле нарисовано, часть под кнопкой — это изображение, созданное из JLayeredPane
)
Вот полный код:
public class LayeredPaneEx extends JPanel {
private JLayeredPane layeredPane;
public LayeredPaneEx() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new Dimension(300, 310));
layeredPane.setLayout(null);
Canvas panel = new CustomCanvas();
panel.setSize(300, 400);
CustomPanel customPanel = new CustomPanel();
layeredPane.add(panel, new Integer(0));
layeredPane.add(customPanel, new Integer(1));
add(layeredPane);
JButton paintBtn = new JButton("Paint All");
paintBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ImageIcon icon = new ImageIcon(paintAllToImage(layeredPane));
JLabel imageLabel = new JLabel(icon);
add(imageLabel);
}
});
add(paintBtn);
JLabel paintLabel = new JLabel();
paintLabel.setPreferredSize(new Dimension(300, 300));
}
private class CustomCanvas extends Canvas {
@Override
public void paint(Graphics g) {
g.setColor(Color.YELLOW);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
private class CustomPanel extends JPanel {
CustomPanel() {
setSize(100, 100);
setBackground(Color.RED);
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("LayeredPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new LayeredPaneEx();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public static BufferedImage paintAllToImage(Component component) {
BufferedImage image;
image = new BufferedImage(
component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_RGB
);
component.paintAll(image.getGraphics());
return image;
}
}
Canvas
) с легкими компонентами. Поскольку компоненты AWT не имеют концепции z-упорядочения, вы обнаружите, что это вызовет у вас бесконечные проблемы. Кроме того, вы должны предпочестьprintAll
paintAll
- person MadProgrammer   schedule 16.12.2015