如何每秒移动jlabel?

我尝试每秒向右移动(x ++)

我尝试用线程移动它..

  1. 怎么做? (并且可以看到它每秒移动)
  2. 有没有使用线程的另一种方法吗?
  3. 我应该使用什么版面管理器?

继续我尝试..

public class help { JFrame frame = new JFrame(); JLabel label = new JLabel("target"); public help() { frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(800,600); frame.setLayout(new GridLayout()); frame.add(label); label.setPreferredSize(new Dimension(100,100)); label.setLocation(400, 300); frame.getContentPane().validate(); frame.repaint(); frame.setVisible(true); mysterious(); } void mysterious(){ //////////////////////////////// // part of edit responding David kroukamp Thread t = new Thread(new Runnable() { @Override public void run() { try{ for (int z=0; z<10; z++){ label.setLocation((label.getLocationOnScreen().x+10), label.getLocationOnScreen().y); Thread.sleep(1000); } }catch(Exception ae){ } } }); t.start(); ////////////////////////////// } public static void main(String[]args){ new help(); } } 

非常感谢任何帮助

  • 类名以大写字母开头,即Help
  • 应在Event Dispatch Thread上创建和修改Swing组件
  • 像这样创建一个新的Thread

     Thread t = new Thread(new Runnable() { @Override public void run() { //work here } }); t.start();//start thread 

但是我建议使用Swing Timer因为它在EDT运行:

  • 如何使用Swing Timers

编辑:

根据您的问题,我建议使用Timer ,创建线程点是为了一般知识。

问题是线程不在您的swing GUI的EDT线程上运行,其中Timer作为:

  int delay = 1000; //milliseconds ActionListener taskPerformer = new ActionListener() { int count=0; public void actionPerformed(ActionEvent evt) { if(count==10) {//we did the task 10 times ((Timer)evt.getSource()).stop(); } label.setLocation((label.getLocationOnScreen().x+10), label.getLocationOnScreen().y); System.out.println(SwingUtilities.isEventDispatchThread()); count++; } }; new Timer(delay, taskPerformer).start(); 

参考:

这是一个简单的益智游戏的Swing示例。

Java Swing Shuffle游戏

当您按下“ Pause按钮时,标题将获得动画,直到您释放暂停。 同样,您可以将它用于JLabel 。 源代码也附上。

希望对你有所帮助。

如果将构造函数的那部分放在一个线程中,那么你可以调用thread.sleep(1000); (1秒延迟1000毫秒)然后刷新,这应该在屏幕上移动目标。