repaint()方法无法按预期运行

时间:2014-03-25 22:01:54

标签: java swing actionlistener repaint

我有2个按钮,重置按钮和计算按钮。
重置按钮的唯一目的是重新显示名为JPanel的{​​{1}} 计算按钮的目的是进行计算并更新p1

问题在于,当按下重置按钮时,后跟计算按钮JLabel被重新绘制并且不应该重新绘制(请参阅下面的代码,其中重绘方法不是出现在JPanel的{​​{1}}中。

我想知道为什么会发生这种情况,以及当按下此按钮时,我可以做什么停止重新绘制ActionListener() (重置按钮的功能与预期完全一样,通过重新绘制小组)。

calculateButton

1 个答案:

答案 0 :(得分:4)

你说:

  

问题在于,当按下重置按钮,然后按下计算按钮时,面板将被重新绘制,而不应该重新绘制。 (请参阅下面的代码,其中repB方法不存在于ActionButton的ActionListener()中)。我想知道为什么会发生这种情况,以及当按下此按钮时我可以做些什么来阻止面板重新绘制。 (通过重新绘制面板,重置按钮完全按预期运行。)

根据您目前发布的代码,无法猜出可能出现的问题。我恳请您考虑创建并发布minimal example program,以便我们自己查看您的问题。

但话说回来,我会补充一点,你永远无法完全控制组件的绘制时间,因为许多绘画是由JVM驱动的,它们响应操作系统。这是程序逻辑从不驻留在paint(Graphics g)paintComponent(Graphics g)方法覆盖中的一个原因。

所以你的问题实际上是伪装的XY Problem。当你应该询问如何从一种绘画方法中获取程序逻辑时,你会问如何控制组件的重新绘制,事实上这是我对你的问题的解决方案的猜测 - 确保你的绘画方法仅用于绘画而不是其他任何东西。


修改
是的,你在paintComponent方法中有程序逻辑,特别是这段代码:

Random rand = new Random(System.currentTimeMillis());
center1X=rand.nextInt(507);
center1Y=rand.nextInt(320);
center2X=rand.nextInt(507);
center2Y=rand.nextInt(320);
center3X=rand.nextInt(507);
center3Y=rand.nextInt(320);

将它从paintComponent中取出并使用自己的方法来控制何时调用它。


编辑2
例如,您可以这样做:

public class CircleDraw extends JPanel {
  private int radius;
  private double s;
  private double area;
  private Random rand = new Random(); // make this a field

  // call this when you want to change the random images
  public void randomizeDrawing() {
     center1X = rand.nextInt(507);
     center1Y = rand.nextInt(320);
     center2X = rand.nextInt(507);
     center2Y = rand.nextInt(320);
     center3X = rand.nextInt(507);
     center3Y = rand.nextInt(320);
     repaint();
  }

  // and only do painting in paintComponent
  @Override
  protected void paintComponent(Graphics g) {
     super.paintComponent(g);

     // draw the 3 circles
     g.drawOval(center1X, center1Y, 100, 100);
     g.drawOval(center2X, center2Y, 100, 100);
     g.drawOval(center3X, center3Y, 100, 100);

     // connect the centers of the circles with lines
     g.drawLine(center1X + 50, center1Y + 50, center2X + 50, center2Y + 50);
     g.drawLine(center2X + 50, center2Y + 50, center3X + 50, center3Y + 50);
     g.drawLine(center3X + 50, center3Y + 50, center1X + 50, center1Y + 50);
  }