Java 当状态更改时停止JComponent重新绘制
我敢肯定,这有点像一个超级愚蠢的标准问题,但我花了几个小时搜索并试图修复它,但它就是不起作用。。。我只是在这里找不到我的错误 我试图构建一个简单的程序,在JComponent上打印一些东西。paintComponent()方法引用了一些变量,如果我这样说的话,我只希望JComponent重新绘制!但每当我改变变量时,它总是重新绘制 这是我的两门课的代码:Java 当状态更改时停止JComponent重新绘制,java,swing,jframe,repaint,jcomponent,Java,Swing,Jframe,Repaint,Jcomponent,我敢肯定,这有点像一个超级愚蠢的标准问题,但我花了几个小时搜索并试图修复它,但它就是不起作用。。。我只是在这里找不到我的错误 我试图构建一个简单的程序,在JComponent上打印一些东西。paintComponent()方法引用了一些变量,如果我这样说的话,我只希望JComponent重新绘制!但每当我改变变量时,它总是重新绘制 这是我的两门课的代码: import java.awt.Dimension; import javax.swing.*; public class SimplePa
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);
}
}
及
显示内容:带有矩形(50、60、140、300)的画布
什么应该显示:空白画布,如果我然后将SP.PC.PrPr.To(或)类似的方法放在主方法中,它应该重新绘制,因此显示矩形…
你不能对何时调用和多少次<代码> PruttCys进行任何假设。使框架可见时,将调用它。如果你最大化你的框架,等等。。。在许多情况下,
paintComponent
将被调用
解决方案非常简单:
- 在
类上添加一个标志(PaintingCanvas
)booleanDrawRectangle=false;
- 在
中,检查标志的值并相应地绘制(或不绘制)矩形paintComponent
- 要显示矩形时,请切换标志的值
paintComponent
的时间和次数做出任何假设。使框架可见时,将调用它。如果你最大化你的框架,等等。。。在许多情况下,paintComponent
将被调用
解决方案非常简单:
- 在
类上添加一个标志(PaintingCanvas
)booleanDrawRectangle=false;
- 在
中,检查标志的值并相应地绘制(或不绘制)矩形paintComponent
- 要显示矩形时,请切换标志的值
repait
是一种向repaitmanager
指示组件的内部状态已更改,并且希望对其进行重新绘制的方法。最终,将调用paintComponent方法并刷新组件。调用repaint
通常是定制组件所必需的。Aaaaah,非常感谢:)这太简单了,以至于我为自己没有得到这个想法而感到羞愧…:但这引发了另一个问题:我读了一些教程,包括这一部分(“RICHTIGER ANSATZ”)现在想知道,如果我正在使用按钮,为什么我必须自己调用重新绘制。。。?!它们的颜色和形状变量在按下按钮时会发生变化,并且只有在actionListener显式调用repaint时才会发生变化@用户2393914调用repait
是一种向repaitmanager
指示组件的内部状态已更改,并且希望对其进行重新绘制的方法。最终,将调用paintComponent方法并刷新组件。调用repaint
通常是自定义组件所必需的。
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;
}
}