在状态更改时停止重新绘制JComponent

时间:2013-05-17 12:52:58

标签: java swing jframe repaint jcomponent

我敢肯定,这就像一个超级愚蠢的标准问题,但我花了几个小时搜索并尝试解决这个问题,但它不会起作用......我在这里找不到我的错误。 ..

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

继承我的两个班级的代码:

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()或类似的东西,它应该重新绘制并因此显示矩形......

1 个答案:

答案 0 :(得分:3)

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

解决方案非常简单:

  • boolean drawRectangle = false;班级
  • 上添加一个标记(PaintingCanvas
  • paintComponent中检查标志的值并相应地绘制(或不绘制)矩形
  • 当您想要显示矩形时,切换标志的值