2013-02-13 356 views
0

下面的程序基本上調用JFrame的frame.repaint()來動態填充框架。 在同一行上,我想要有2個標籤(West & East),並且標籤動態變化。 我已經嘗試了lotta的東西,Jlabel label.repaint(),label.removeAll()等,但它不起作用。我已經離開了代碼,乾淨,這樣就可以填補...如何動態更改JLabel的內容

JFrame frame=new JFrame(); 
frame.setSize(512, 512); 
frame.add(image1); 
frame.setVisible(true); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


start_sum=0; 

while(true) 
{ 
    frame.repaint(); 
    try { 
     Thread.sleep(sleep_for_each_rotation); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    start_sum+=radian/divide_size;    //Some calculation stuff 
    if(start_sum>=360) 
     start_sum=0; 

} 
+0

我沒有看到任何'JLabel'中的代碼。 downvote – 2013-02-13 10:19:47

+1

正如我所提到的,我已經嘗試過Jlabel並且失敗了......所以我已經清理了所有Jlabel varibales – 2013-02-13 10:22:32

+0

那麼,如果您清理了所有JLabel,那麼問題是什麼? – 2013-02-13 10:28:55

回答

-1

只需使用JLabel.setText (String)方法就像下面這個例子:

public static void main (String[] args) throws Exception { 
    final JLabel label = new JLabel (String.valueOf (System.currentTimeMillis())); 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout (new BorderLayout()); 
    frame.getContentPane().add (label, BorderLayout.CENTER); 
    frame.pack(); 
    frame.setVisible(true); 

    while (true) 
    { 
     final String newText = String.valueOf (System.currentTimeMillis()); 

     SwingUtilities.invokeLater (new Runnable() 
     { 
      @Override 
      public void run() { 
       label.setText (newText); 
      } 
     }); 

     Thread.sleep (100L); 
    } 
} 
+0

或'label.setIcon(icon);' – 2013-02-13 10:20:56

+1

因此,您的示例在EDT之外創建UI,只是運氣好,可以運行。這是不該做的一個很好的例子。看看[初始線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) – MadProgrammer 2013-02-13 10:31:29

+0

agreeeeeeeeeeeeeeeeed – mKorbel 2013-02-13 15:40:18

2

從你的代碼看起來,你是阻止事件調度線程(EDT)。

EDT負責(除其他事項外)處理重新繪製事件。這意味着如果你阻止美國東部時間,什麼都不能重新粉刷。

您擁有的另一個問題是,您不應該創建或修改除EDT以外的任何線程的任何UI組件。

查看Concurrency in Swing瞭解更多詳情。

以下示例僅使用javax.swing.Timer,而是從事物的聲音,你可能會發現Swing Worker更多有用的

public class TestLabelAnimation { 

    public static void main(String[] args) { 
     new TestLabelAnimation(); 
    } 

    public TestLabelAnimation() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JLabel left; 
     private JLabel right; 

     public TestPane() { 
      setLayout(new BorderLayout()); 

      left = new JLabel("0"); 
      right = new JLabel("0"); 

      add(left, BorderLayout.WEST); 
      add(right, BorderLayout.EAST); 

      Timer timer = new Timer(250, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        left.setText(Integer.toString((int)Math.round(Math.random() * 100))); 
        right.setText(Integer.toString((int)Math.round(Math.random() * 100))); 
       } 
      }); 

      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 

     } 

    } 

} 
+0

請問爲什麼'timer.setCoalesce(true);',看到很多次最後一次 – mKorbel 2013-02-13 15:38:54

+1

@mkorbel據我所知,coalesce意味着如果計時器發現自己有多個事件同時觸發(因爲某種原因),它們將被合併成一個事件,而不是一個事件緊密時間事件的數量。對我來說,確保我不會使EDT不必要地飽和 – MadProgrammer 2013-02-13 19:28:29