0

我敢肯定,这就像一个超级愚蠢的标准问题,但我花了几个小时搜索并试图解决这个问题,但它根本行不通......我只是在这里找不到我的错误......

我正在尝试构建一个在 JComponent 上打印某些内容的简单程序。paintComponent() 方法引用了一些变量,如果我这么说,我只希望 JComponent 重新绘制!但是每当我更改变量时,它总是会重新绘制...

这是我的 2 个类的代码:

import java.awt.Dimension;
import javax.swing.*;

public class SimplePaint extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private PaintingCanvas pc;


public SimplePaint() {

    super("SimplePaint");

    this.pc = new PaintingCanvas();
    this.pc.setPreferredSize(new Dimension(800, 600));


    this.add(pc);
    this.setResizable(false);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.pack();
    this.setVisible(true);
    this.setLocationRelativeTo(null);

}


public static void main(String[] args) {

    SimplePaint sp = new SimplePaint();

    sp.pc.setxStart(50);
    sp.pc.setyStart(60);
    sp.pc.setxEnd(140);
    sp.pc.setyEnd(300);

}



}

import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;

public class PaintingCanvas extends JComponent {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private int xStart, yStart;
private int xEnd, yEnd;

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;

    g2d.fillRect(xStart, yStart, xEnd, yEnd);
}

/**
 * @param xStart the xStart to set
 */
public void setxStart(int xStart) {
    this.xStart = xStart;
}

/**
 * @param yStart the yStart to set
 */
public void setyStart(int yStart) {
    this.yStart = yStart;
}


/**
 * @param xEnd the xEnd to set
 */
public void setxEnd(int xEnd) {
    this.xEnd = xEnd;
}

/**
 * @param yEnd the yEnd to set
 */
public void setyEnd(int yEnd) {
    this.yEnd = yEnd;
}

}

它显示的内容:带有矩形(50、60、140、300)的画布......

应该显示什么:空白画布,然后如果我将 sp.pc.repaint() 或类似的东西放在 main 方法中,它应该重新绘制并因此显示矩形......

4

1 回答 1

3

您无法对何时调用以及调用多少次做出任何假设paintComponent。当使框架可见时,它将被调用。如果你也最大化你的框架,等等......有很多情况paintComponent会被调用。

解决方案非常简单:

  • 在您的班级上添加标志 ( boolean drawRectangle = false;)PaintingCanvas
  • 检查paintComponent标志的值并相应地绘制(或不绘制)矩形
  • 当您希望矩形出现时,切换标志的值
于 2013-05-17T13:07:34.783 回答