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

ffscu2ro  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(502)

我想把整个画布都填满 fillRect . 无论何时我包括 super.paint() 在被覆盖的 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);
    }

}
iklwldmw

iklwldmw1#

我对张贴的代码没有问题。
我不太清楚它的设计意图是什么。总是画一个黑色的背景。
但是,发布的代码不遵循swing准则:
所有swing组件都应该在 Event Dispach Thread (EDT) . 这是通过使用 SwingUtilities.invokeLater(...) . 阅读swing教程中有关并发性的部分,以获取有关如何更好地构造代码的更多信息和示例。不在edt上执行代码可能会导致随机问题。
不应重写jframe中的paint()。自定义绘制是通过覆盖 paintComponent(...)JPanel 然后将面板添加到框架中。阅读swing教程中有关自定义绘制的部分,了解更多信息和工作示例。

相关问题