Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame的怪异外观,屏幕有时是完全白色的_Java_Swing_Jframe_Paint - Fatal编程技术网

Java JFrame的怪异外观,屏幕有时是完全白色的

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

我正在写一个程序,它会画一条线,然后复制它,旋转90度,然后一遍又一遍地对整个图片做同样的操作。 我的问题是,我使用的JFrame有时不会画第一条线,而是将整个框架变成白色。我找不到原因,有时有效,有时无效,完全是随机的。也许我没有真正了解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);
}

}
下面是我得到的两个结果的图片: |

您已经在
绘制
重新绘制
方法之间创建了一个循环依赖关系,它阻止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
方法?请看一下使用