调用super.paint jframe时的竞赛条件



我正在尝试用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指南:

  1. 所有Swing组件都应该在Event Dispach Thread (EDT)上创建和更新。这是通过使用SwingUtilities.invokeLater(...)来完成的。阅读Swing教程中关于并发的部分,了解有关如何更好地构建代码的更多信息和示例。不在EDT上执行代码可能会导致随机问题。

  2. 您不应该在JFrame中重写paint((。自定义绘制是通过覆盖JPanel上的paintComponent(...),然后将面板添加到框架中来完成的。阅读Swing教程中关于自定义绘制的部分,了解更多信息和工作示例。

最新更新