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