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