Java JFrame的怪异外观,屏幕有时是完全白色的
我正在写一个程序,它会画一条线,然后复制它,旋转90度,然后一遍又一遍地对整个图片做同样的操作。 我的问题是,我使用的JFrame有时不会画第一条线,而是将整个框架变成白色。我找不到原因,有时有效,有时无效,完全是随机的。也许我没有真正了解paint()方法的工作原理。 以下是我的代码中不起作用的部分:Java JFrame的怪异外观,屏幕有时是完全白色的,java,swing,jframe,paint,Java,Swing,Jframe,Paint,我正在写一个程序,它会画一条线,然后复制它,旋转90度,然后一遍又一遍地对整个图片做同样的操作。 我的问题是,我使用的JFrame有时不会画第一条线,而是将整个框架变成白色。我找不到原因,有时有效,有时无效,完全是随机的。也许我没有真正了解paint()方法的工作原理。 以下是我的代码中不起作用的部分: import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.J
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
public class WeirdThing extends JFrame {
static final int winWidth = 800;
static final int winHeight = 600;
boolean start;
public WeirdThing() {
super("WeirdThing");
start = true;
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (start) {
g2.setColor(Color.BLACK);
g2.drawLine(winWidth / 2, winHeight / 2, winWidth / 2 + 5, winHeight / 2);
start = false;
}
repaint();
}
public static void main(String[] args) {
WeirdThing a = new WeirdThing();
a.setDefaultCloseOperation(EXIT_ON_CLOSE);
a.setSize(winWidth, winHeight);
a.setVisible(true);
}
}
下面是我得到的两个结果的图片:
|
您已经在
绘制
和重新绘制
方法之间创建了一个循环依赖关系,它阻止Swing更新UI-删除重新绘制
方法
通过覆盖
paintComponent
而不是paint
完成Swing中的自定义绘制。记住调用super.paintComponent(g)
切勿在paint()
方法中使用repaint()
,因为repaint()
调用paint()
。请尝试以下代码:
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
System.out.println(start);
if (start) {
g2.setColor(Color.BLACK);
g2.drawLine(winWidth / 2, winHeight / 2, winWidth / 2 + 5, winHeight / 2);
start = false;
} else {
g2.drawLine(100, 100, 200, 200);
}
// repaint();
}
您可以看到start变量的生命周期。我想你只需要这样的东西:
public void paint(Graphics g) {
super.paintComponents(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
g2.drawLine(winWidth / 2, winHeight / 2, winWidth / 2 + 5, winHeight / 2);
}
但是在一个类似的程序中,我也使用了
paint
方法中的repaint
方法。我是否应该在其中构建暂停程序的东西,以便它可以更新为paint
方法?请看一下使用