我敢肯定,这就像一个超级愚蠢的标准问题,但我花了几个小时搜索并尝试解决这个问题,但它不会起作用......我在这里找不到我的错误。 ..
我正在尝试构建一个在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()或类似的东西,它应该重新绘制并因此显示矩形......
答案 0 :(得分:3)
您无法对调用paintComponent
的时间和次数做出任何假设。在使框架可见时,可以调用它。如果你也最大化你的框架等......有很多情况会调用paintComponent
。
解决方案非常简单:
boolean drawRectangle = false;
班级PaintingCanvas
)
paintComponent
中检查标志的值并相应地绘制(或不绘制)矩形