3

我想做一个代码,从面板的左侧移动到面板的右侧......我意识到你可以简单地让一个图像出现在代码块中,然后在下一个块中代码让图像被一个完全相同的正方形重叠,只是与背景颜色相同...为此,我需要一个类似代码的计时器,使其显示图像,然后 1 秒后它重叠并然后新图像出现在它旁边

意识到 sleep.thread 不适用于 gui 我正在求助于 Javax.Swing.Timer

我现在只想让它旁边出现一个框

但是我没有这方面的经验,需要一些帮助才能让它与我的代码一起使用 - 安德鲁

    {

          g.setColor(Color.GREEN);
          g.fillRect(50, 100, 100, 100); //first box on a red background

                      //Timer goes here

                      g.setColor(Color.RED);
          g.fillRect(50, 100, 100, 100);//overlapps the first box
                      g.setColor(Color.GREEN);
          g.fillRect(50, 110, 100, 100);//sets a new box right beside it

    }

}
4

4 回答 4

2

创建一个javax.swing.Timer实际上非常简单。您不必自己担心线程,因为调度会在后台线程中自动发生,但您实现的侦听器的代码是在 GUI 线程中执行的。因此,您可以使用侦听器主体中所需的任何摆动组件。

int interval = 1000; // repeating every 1000 ms
new Timer(interval, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do whatever painting that you want
    }
}).start();
于 2012-12-13T18:06:46.647 回答
1

你初始化它:

Timer <timernamegoeshere> = new Timer(<delayinmilis>,<actionlistener>);

因此,您在计时器中输入的每一毫秒都会构造一个动作。

这意味着您可以简单地将更新代码放入 中,actionPerformed并有一个变量增加您移动正方形的像素数量和一个布尔值,从 切换truefalsetrue它绘制它,并将false它设置为背景的颜色。

于 2012-12-13T17:33:45.867 回答
1

我建议你使用 ExecutorService

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

例如,您可以做类似的事情

private static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
scheduledThreadPool.scheduleAtFixedRate(new DrawingTask(), 1000, 1000 TimeUnit.MILLISECONDS);

您的绘图任务可能如下所示:

public class DrawingTask extends TimerTask {

@Override
public void run() {
// previous co ordinates. This should be static
// sleep for a second
// re draw the old one
// draw the new one
}
}
于 2012-12-13T17:57:20.793 回答
1

我不确定这是否是最好的方法,但您可以轻松地重新定义一个正方形以拥有一个位置。反过来,您可以让计时器更新方形实例的位置,然后调用 repaint()。这意味着paint方法只是在新位置绘制背景和同一个正方形,而不是每次都创建一个新正方形。

然后,您的绘画方法可能具有以下内容:

g.drawRect(referenceToSquare.getLocation().getX(), referenceToSquare.getLocation().getY(), 100, 100)

您使用以下命令初始化计时器:

   Timer timer = new Timer(delayInMillis);
   timer.add(new ActionListener());

然后在同一个班级有一个...

     actionPerformed(ActionEvent e) {
       if(e.getSource() == timer) {
           referenceToSquare.getLocation().getX()++;
       }
       frame.repaint();
     }

http://docs.oracle.com/javase/6/docs/api/java/awt/event/ActionListener.html

于 2012-12-13T17:43:16.727 回答