我正在尝试用fillRect
填充整个画布。每当我在重写的paint
方法的开头包含super.paint()
时,super.paint()
有时会在fillRect
之后被调用,从而导致super.paint()
是先绘制还是先绘制drawRect
的不可预测行为。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class DebugJFrameRace extends JFrame {
public DebugJFrameRace () {
super("Debug race");
this.setVisible(true);
this.setSize(600, 600);
this.repaint();
}
public void paint(Graphics g) {
super.paint(g);
// clear background
g.setColor(Color.black);
g.fillRect(0, 0, 600, 600);
System.out.println("Finished");
}
public static void main(String[] args) {
DebugJFrameRace app = new DebugJFrameRace ();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我对发布的代码没有问题。
我真的不确定它是为了展示什么。总是画黑色背景。
然而,发布的代码没有遵循Swing指南:
-
所有Swing组件都应该在
Event Dispach Thread (EDT)
上创建和更新。这是通过使用SwingUtilities.invokeLater(...)
来完成的。阅读Swing教程中关于并发的部分,了解有关如何更好地构建代码的更多信息和示例。不在EDT上执行代码可能会导致随机问题。 -
您不应该在JFrame中重写paint((。自定义绘制是通过覆盖
JPanel
上的paintComponent(...)
,然后将面板添加到框架中来完成的。阅读Swing教程中关于自定义绘制的部分,了解更多信息和工作示例。