【问题标题】:Java paint error during maximizing JFrame最大化 JFrame 期间的 Java 绘制错误
【发布时间】:2013-05-26 03:22:31
【问题描述】:

我已经按照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);
    }
}

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

但我最大化 JFrame,图像被重新绘制。但旧图依旧。

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

【问题讨论】:

  • 1) 不要在JFrame 等顶级容器中进行绘制,而是添加JPanel 并在paintComponent(Graphics) 方法中进行自定义绘制。还为自定义组件返回一个合理的首选大小,以协助布局管理器。 2)不要设置顶级容器的大小。而是布局内容并致电pack()
  • 好的....我也会这样

标签: java swing graphics jframe paint


【解决方案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);
    // ...

【讨论】:

    【解决方案2】:
    1. 你应该打电话给super.paintXxx
    2. 您应该避免覆盖顶级容器的paint 方法(如JFrame),而是使用类似JPanel 的方法并覆盖它的paintComponent 方法。主要原因是; 1- 顶级容器不是双缓冲的,这意味着当组件被重新绘制时你会得到闪烁。 2-您可以防止其他内容被正确绘制(例如不调用super.paint

    查看Custom PaintingPainting in AWT and Swing 了解更多详情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      相关资源
      最近更新 更多