当多个JFrame排队等待重绘时,Swing重绘事件将所有帧的内容绘制到所有帧上,就像它与其他帧共享JPanel一样。
在下面的示例中,“第1帧”应仅绘制正方形,而“第2帧”应仅绘制椭圆即可。相反,他们的图形在某种程度上重叠。 JPanels不以任何方式,形状或形式共享,因此这是不可能的。
我想看到的是:
出于某种原因,这只发生在循环中绘制帧时(例如,60 FPS)。
我在Windows 10 x64上运行Java 1.8.0_25。
我已经在这几个小时了,我在网上找不到任何关于这个...有没有人知道如何避免这个问题?或者如果有解决方法?
以下是代码:
JFrame frame1 = new JFrame("Frame 1");
frame1.setSize(256, 256);
frame1.setLocation(0, 0);
JPanel panel1 = new JPanel() {
public void paintComponent(Graphics g) {
g.fillRect(32, 32, 32, 32);
}
};
frame1.add(panel1);
frame1.setVisible(true);
JFrame frame2 = new JFrame("Frame 2");
frame2.setSize(256, 256);
frame2.setLocation(300, 0);
JPanel panel2 = new JPanel() {
public void paintComponent(Graphics g) {
g.fillOval(66, 32, 32, 32);
}
};
frame2.add(panel2);
frame2.setVisible(true);
while(true) {
Thread.sleep(16);
panel1.repaint();
panel2.repaint();
}
在覆盖super.paintComponent(g)
方法后,我没有立即添加paintComponent()
。这解决了这个问题。不幸的是,这也会删除JPanel以前的图形内容。