我想制作一个代码,从面板的左侧到面板的右侧进行正方形移动...我意识到你可以简单地将图像显示在代码块上然后在下一个代码块使图像与完全相同的正方形重叠,只是与背景颜色相同...为此,我需要一个像代码一样的计时器,使图像出现,然后1秒后得到它重叠,然后新图像出现在它旁边
意识到sleep.thread不适用于gui我正在使用Javax.Swing.Timer
我只是想让它现在旁边出现一个方框
但是我没有使用它的经验,需要一些帮助才能使用我的代码 -Andrew
{
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
}
}
答案 0 :(得分:2)
实际上创建javax.swing.Timer
非常简单。您不必自己担心线程,因为调度在后台线程中自动发生,但您实现的侦听器的代码在GUI线程中执行。因此,您可以使用侦听器正文中所需的任何swing组件。
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();
答案 1 :(得分:1)
您可以使用以下命令对其进行初始化:
Timer <timernamegoeshere> = new Timer(<delayinmilis>,<actionlistener>);
因此,您在计时器中输入的每一个毫秒都会执行一个动作。
这意味着您可以简单地将更新代码放入actionPerformed
并使变量增加您移动平方的像素数和布尔值,从true
切换到{ {1}},false
表示它绘制它,true
表示它将其设置为背景颜色。
答案 2 :(得分: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
答案 3 :(得分: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
}
}