【问题标题】:using repaint() method in this code在这段代码中使用 repaint() 方法
【发布时间】:2011-06-05 14:32:39
【问题描述】:

我在以下代码中使用重绘方法时遇到问题。请建议如何使用重绘方法,以便我的屏幕更新为小动画。 这是我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class movingObjects extends JPanel {
   Timer timer;
   int x = 2, y = 2, width = 10, height = 10;

   public void paintComponent(final Graphics g) { // <---- using repaint method
      ActionListener taskPerformer = new ActionListener() {
         public void actionPerformed(ActionEvent ae) {
            g.setColor(Color.red);
            g.drawOval(x, y, width, height);
            g.fillOval(x, y, width, height);
            x++;
            y++;
            width++;
            height++;
         }
      };
      new Timer(100, taskPerformer).start();
   }
}

class mainClass {
   mainClass() {
      buildGUI();
   }

   public void buildGUI() {
      JFrame fr = new JFrame("Moving Objects");
      movingObjects obj = new movingObjects();
      fr.add(obj);
      fr.setVisible(true);
      fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      fr.setSize(1300, 700);
   }

   public static void main(String args[]) {
      new mainClass();
   }
}

【问题讨论】:

  • 我以前从未见过在paintComponent 方法中创建的ActionListener。您会因创造力而获得积分,但不会因功能而获得积分。从 paintComponent 方法中获取它。
  • @Hovercraft Full Of Eels 你能说出背后的原因吗?
  • 你在 2 天前得到了这个问题的答案:stackoverflow.com/questions/6228775/…。不要浪费我们的时间,并注意给出的答案。我告诉过你不要在paintComponent() 中有循环。我为您提供了 Swing 教程的链接,该教程解释了如何进行绘画以及如何使用计时器。不要指望我们用勺子喂代码。

标签: java swing user-interface graphics


【解决方案1】:

不要试图延迟实际的绘画。组件在被要求绘制时需要被绘制。

改为使用您的计时器来修改MovingObjects 中的某些状态。在您的情况下,您要更改的状态是 xywidthheight。当你的计时器触发时,增加这些值并调用repaint()

然后在您的 paintComponents 方法中,您只需使用这些值来绘制组件

public void paintComponent(Graphics g) {
  g.setColor(Color.red);
  g.drawOval(x,y,width,height);
  g.fillOval(x,y,width,height);
}

编辑

不确定您遇到了什么问题,但调用 repaint() 并不困难:

ActionListener taskPerformer=new ActionListener() {
   public void actionPerformed(ActionEvent ae) {
      x++;
      y++;
      width++;
      height++;
      repaint();
   }
};
new Timer(100,taskPerformer).start();

【讨论】:

  • 你能告诉我这里怎么叫repaint吗?
  • @Suhail:只需从 Swing Timer 调用 repaint。
  • @Mark Peters 我做不到。您能否详细说明答案中的代码。 (使用重绘())
  • @Suhail:我更新了你的答案,但我不确定你遇到了什么问题。如果你仍然不能让它工作,你需要更加努力地描述你的问题。 “我做不到”没有提供信息。
  • 阅读 Timer API 了解如何停止它!
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多