我正在编写一个程序,它将绘制一条线,然后复制它,将其旋转90度左右,并对整个图像反复进行相同的操作。 我的问题是,我使用的JFrame有时不会绘制第一行,而是使完整的Frame变为白色。我无法找到理由,有时它会起作用,有时它不会,它是完全随机的。也许我并没有真正了解paint()方法的工作原理。 这是我的代码中不起作用的部分:
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);
}
}
以下是我得到的两个结果的图片: Wanted Result | Result I don't want
答案 0 :(得分:2)
您在paint
和repaint
方法之间创建了循环依赖关系,这阻止了Swing更新UI - 删除repaint
方法
Swing中的自定义绘制是通过覆盖paintComponent
而不是paint
来完成的。请记得调用super.paintComponent(g)
。
答案 1 :(得分:0)
永远不要在repaint()
方法中使用paint()
,因为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();
}
您可以看到启动变量的生命周期。我想你只需要这样的东西:
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);
}