如何每秒移动jlabel?

mop*_*opr 1 java swing multithreading 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();  
        }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助

Dav*_*amp 6

但是我建议一个Swing Timer,因为它运行在EDT:

编辑:

根据你的问题,我建议使用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();
Run Code Online (Sandbox Code Playgroud)

参考: