2012-11-05 53 views
1

我嘗試將其移動到右側(X ++)每秒鐘如何每秒移動jlabel?

我嘗試將其與移動主題..

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

非常感謝任何形式的幫助

回答

6
  • 類名稱以大寫字母,即Help
  • Swing組件,應創建並修改上Event Dispatch Thread
  • Thread創建這樣的:

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

但是我因爲它運行在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(); 

參考:

+0

^^非常感謝..它的工作..但有一些東西,你能給我提示jlabel的位置y爲什麼會改變嗎? (我編輯我的代碼)..也許有問題沒有3的建議? 感謝您的定時器 –

+0

wew對不起。它的變化,因爲getLocationOnScreen(){我不知道爲什麼}但如果我改變它與getLocation()它返回正常 –

+0

@moprmopr請參閱編輯 –

1

如果你把構造的一部分在一個線程,那麼你可以調用thread.sleep(1000);(1000毫秒延遲1秒),然後刷新,這應該在整個屏幕上移動目標。

+1

怎麼樣?道歉,因爲我無法得到它.. 你能告訴我的代碼? –

2

這裏是一個簡單的益智遊戲的Swing的例子。

Java Swing Shuffle Game

當你按下按鈕Pause稱號將獲得動畫顯示,直到您解除休止。同樣,您可以將它用於JLabel。源代碼也附帶。

希望能夠幫助你很多。

+0

^^非常感謝..這將有助於.. –

+0

@moprmopr:不要忽視你發現有用的答案。 – trashgod