Java 当状态更改时停止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

我敢肯定,这有点像一个超级愚蠢的标准问题,但我花了几个小时搜索并试图修复它,但它就是不起作用。。。我只是在这里找不到我的错误

我试图构建一个简单的程序,在JComponent上打印一些东西。paintComponent()方法引用了一些变量,如果我这样说的话,我只希望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);

}



}

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


什么应该显示:空白画布,如果我然后将SP.PC.PrPr.To(或)类似的方法放在主方法中,它应该重新绘制,因此显示矩形…

你不能对何时调用和多少次<代码> PruttCys进行任何假设。使框架可见时,将调用它。如果你最大化你的框架,等等。。。在许多情况下,

paintComponent
将被调用

解决方案非常简单:

  • PaintingCanvas
    类上添加一个标志(
    booleanDrawRectangle=false;
  • paintComponent
    中,检查标志的值并相应地绘制(或不绘制)矩形
  • 要显示矩形时,请切换标志的值

您无法对调用
paintComponent
的时间和次数做出任何假设。使框架可见时,将调用它。如果你最大化你的框架,等等。。。在许多情况下,
paintComponent
将被调用

解决方案非常简单:

  • PaintingCanvas
    类上添加一个标志(
    booleanDrawRectangle=false;
  • paintComponent
    中,检查标志的值并相应地绘制(或不绘制)矩形
  • 要显示矩形时,请切换标志的值

Aaaaah,非常感谢:)这太简单了,我为自己没有得到这个想法而感到羞愧……:但这引发了另一个问题:我读了一些教程,包括这一部分(“RICHTIGER ANSATZ”)现在想知道,如果我正在使用按钮,为什么我必须自己调用重新绘制。。。?!它们的颜色和形状变量在按下按钮时会发生变化,并且只有在actionListener显式调用repaint时才会发生变化@用户2393914调用
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;
}

}