繁体   English   中英

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

[英]race condition when calling super.paint jframe

我正在尝试用fillRect填充整个 canvas 。 每当我在重写的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 教程中关于自定义绘画的部分,了解更多信息和工作示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM