最大化JFrame期间的Java绘制错误

时间:2013-05-26 03:22:32

标签: java swing graphics jframe paint

我已按照JFrame中的代码进行绘制。

package march_2013;

import java.awt.Graphics;
import javax.swing.JFrame;

public class Question7 extends JFrame {

    public void paint(Graphics g) {
        int[] x = new int[] { 10, 60, 360, 410, 210, 210, 260, 210, 190, 160,
                190, 190 };
        int[] y = new int[] { 200, 250, 250, 200, 200, 180, 180, 100, 100, 160,
                160, 200 };
        g.drawPolygon(x, y, x.length);
        g.drawLine(190, 100, 190, 180);
        g.drawLine(210, 100, 210, 180);
    }

    public static void main(String[] args) {
        Question7 window = new Question7();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setBounds(440, 40, 420, 400);
        window.setVisible(true);
    }
}

它工作正常,提供以下输出。

enter image description here

但是我最大化了JFrame,重新绘制了图像。但旧图像仍然存在。

enter image description here

如何解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:1)

调用super.paint()

public void paint(Graphics g) {
    super.paint(g);
    // ...

API document of paint说:

  

如果重新实现此方法,则应调用super.paint(g)以便正确呈现轻量级组件。

确保背景为白色:

public void paint(Graphics g) {
    super.paint(g);
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(Color.BLACK);
    // ...

答案 1 :(得分:1)

  1. 您应该致电super.paintXxx
  2. 您应该避免覆盖顶级容器的paint方法(例如JFrame),而是使用JPanel之类的方法覆盖它的paintComponent方法。主要原因是; 1-顶级容器不是双缓冲的,这意味着在重新绘制组件时会出现闪烁。 2-您可以阻止其他内容被正确绘制(例如不要调用super.paint
  3. 查看Custom PaintingPainting in AWT and Swing了解详情