【问题标题】:Weird bevaviour of JFrame, screen sometimes completely whiteJFrame 的奇怪行为,屏幕有时全白
【发布时间】:2014-03-09 14:23:40
【问题描述】:

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

【问题讨论】:

    标签: java swing jframe paint


    【解决方案1】:

    您在 paintrepaint 方法之间创建了一个循环依赖关系,这会阻止 Swing 更新 UI - 删除 repaint 方法


    Swing 中的自定义绘制是通过覆盖 paintComponent 而不是 paint 来完成的。记得调用super.paintComponent(g)

    【讨论】:

    • 但在一个类似的程序中,我还在paint 方法中使用了repaint 方法。我应该在其中构建一些东西来暂停程序,以便它可以更新到paint 方法吗?
    • 看看使用 Swing Timer 定期重绘 UI
    【解决方案2】:

    永远不要在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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多