如何每秒移动jlabel?

时间:2012-11-05 04:59:02

标签: java multithreading swing jlabel

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

我尝试用线程移动它..

  1. 怎么办? (并且可以看到它每秒移动一次)
  2. 还有另一种方法可以不使用线程吗?
  3. 我应该使用什么版面管理器?
  4. 继承人我试试..

    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();  
            }
    }
    

    非常感谢任何帮助

3 个答案:

答案 0 :(得分:6)

  • 班级名称以大写字母开头,即Help
  • 应在Event Dispatch Thread
  • 上创建和修改Swing组件
  • 新的Thread就像这样创建:

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

然而,我建议在Timer上运行Swing EDT

修改

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

问题是Thread没有在你的swing GUI的EDT Thread上运行,而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();

<强>参考:

答案 1 :(得分:2)

以下是简单益智游戏的Swing示例。

Java Swing Shuffle Game

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

希望对你有所帮助。

答案 2 :(得分:1)

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