Javax.swing.timer with GUI (Eclipse)



我想制作一个从面板左侧移动到面板右侧的正方形移动的代码......我意识到你可以简单地让一个图像出现在代码块上,然后在下一个代码块中,让图像被一个完全相同的正方形重叠,只是与背景的颜色相同......为此,我需要一个类似代码的计时器,使图像出现,然后在 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
    }
}

创建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();

你用以下命令初始化它:

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

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

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

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

然后,您的绘画方法可以如下所示:

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

我建议你使用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
}
}

最新更新