簡體   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