在此代码中使用repaint()方法

时间:2011-06-05 14:32:39

标签: java swing user-interface graphics

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

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();
   }
}

1 个答案:

答案 0 :(得分:2)

不要试图延迟实际的绘画。当要求涂漆时,需要对组件进行涂漆。

相反,请使用您的计时器修改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();