JFrame的奇怪行为,屏幕有时完全是白色的

时间:2014-03-09 14:23:40

标签: java swing jframe paint

我正在编写一个程序,它将绘制一条线,然后复制它,将其旋转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

2 个答案:

答案 0 :(得分:2)

您在paintrepaint方法之间创建了循环依赖关系,这阻止了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);
}