1

我尝试每秒钟将其向右移动(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();  
        }
}

非常感谢任何帮助

4

3 回答 3

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

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

但是我建议在Timer运行时使用 Swing EDT

编辑:

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

问题是线程未在您的摇摆 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();

参考:

于 2012-11-05T05:23:54.733 回答
2

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

Java Swing 随机播放游戏

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

希望对你有很大帮助。

于 2012-11-05T05:31:47.460 回答
1

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

于 2012-11-05T05:16:27.503 回答