2013-11-01 37 views
1

我試圖創建一個顯示當前時間的Java GUI。目前,我可以使其顯示當前時間,但僅在啓動時顯示。然後它永遠保持在那個時間。原因是我無法弄清楚如何使它每秒自動加載新的當前時間。這裏是我的相關代碼迄今:Java - 如何每秒更新面板

// Getting the current time... 
long epoch = System.currentTimeMillis()/1000; 
String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date(epoch * 1000)); 

// Creating the panel... 
JLabel lblThetime = new JLabel(date); 
sl_panel.putConstraint(SpringLayout.NORTH, lblThetime, 55, SpringLayout.SOUTH, lblIBeA); 
sl_panel.putConstraint(SpringLayout.WEST, lblThetime, 139, SpringLayout.WEST, panel); 
lblThetime.setFont(new Font("Avenir Next", Font.PLAIN, 40)); 

// Adding the time to the panel 
panel.add(lblThetime); 

// My refresher which doesn't work 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     removeAll(); 
     validate(); 
     repaint(); 
    } 
}, 1000, 1000); 

我試圖從this thread使複習使用的信息,但無濟於事,窗口(運行時)僅僅是空白。然後我試圖使利用this thread信息不同的進修,並創造了這個:

// My refresher which doesn't work 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     contentPane.remove(lblThetime); 
     contentPane.add(lblThetime); 
    } 
}, 1000, 1000); 

隨着contentPane已被定義爲private JPanel contentPane;

其中也沒有工作,但是隻有時間本身是空的,窗口中剩餘的內容(另一個JLabel(只是一些文本))保持正常。

沒有任何複習它的行爲如上所述,它只是顯示它開始的時間,並永遠在那個時間。

我使用Eclipse與WindowBuilder。 (而且我(可能很明顯)是Java GUI xD的完整noob)

回答

2

首先你正在使用java.util.Timer代替javax.swing.Timer。使用Swing組件時,您需要使用第二個類來確保在Event Dispatch Thread上進行GUI更新。還可以看看Concurrency in Swing教程。

正如其他答案中所建議的,每次您要更新其文本時,都不需要刪除/添加JLabel。只需撥打JLabel.setText()方法即可。

如果您仍想刪除/添加JLabel各一次,然後就意識到了這一點:

Container.add()的javadoc:

此方法更改佈局相關信息,因此, 無效的組件層次。 如果容器已顯示 ,則此後必須驗證層次結構,以便 顯示添加的組件。

然後您需要撥打Component.revalidate()方法。像這樣:

contentPane.remove(lblThetime); 
contentPane.add(lblThetime); 
contentPane.revalidate(); 
0

而不是刪除和添加到面板的標籤,你應該每秒更改標籤的字符串。

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date()); 

     lblThetime.setText(date); 
    } 
}, 1000, 1000); 



// Creating the panel... 
JLabel lblThetime = new JLabel(date); 
0

您可以嘗試使用Swing計時器的任務,例如:

private static JLabel l; 

public static void main(String[] args) { 

    Timer timer = new Timer(1000, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      l.setText(new Date().toString()); 
     } 
    }); 
    timer.start(); 
    JFrame f = new JFrame(); 
    l=new JLabel(new Date().toString()); 
    f.getContentPane().add(l); 

    f.pack(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
} 

這個例子更新的JLabel與新的日期每秒

-2

線索1:真搜索定時器班Java的。你選了正確的嗎?

線索2:改爲更新標籤文字。

HIH

KL

+2

Hi there Kili Liam。歡迎來到SO並感謝參與,但這不是如何運作的......在這裏,你不應該用謎語和其他問題來回答問題,當然也不是用「RTFM」風格給出「線索」。在這裏你回答問題......答案!你也不應該以「希望它幫助」縮寫爲「HIH」,也不應該縮寫爲你的名字來結束你的答案。如果你不知道或不想給出正確的答案,那麼你根本就不會發布。如果你想評論(而不是回答),你可以使用評論(一旦你獲得了一些代表)。 – TacticalCoder

2

我發現瞭解決方案!

我嘗試了所有在這裏給出答案的解決方案,沒有給代碼充分的工作,但是所有的答案都指向了正確的方向。我找到了解決辦法,而我已經忘記的名字在網站上的問題,但我用它的建議,並與合作這一最終的解決方案提出了:

 // New timer which works! 
    int delay = 1000; //milliseconds 
     ActionListener taskPerformer = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date(System.currentTimeMillis())); 
       lblThetime.setText(date); 
      } 
     }; 
     new Timer(delay, taskPerformer).start(); 

謝謝所有的不說,誰回答的答案我可能不會找到這個解決方案:D

+0

因爲它沒有解決問題,它只能指出我正確的方向。然而,這不是貶低它,因爲它導致我找到上述解決方案,我已經標記爲解決了這個問題。如果我能接受多個答案,我也會接受dic19的答案。 – Warbinator

+0

你的問題是由於沒有使用setText引起的 - 他明確指出。我也相信,因爲他讓你糾正了密碼,所以他值得讚揚。 –

+1

*因爲它沒有解決問題,它只能指出我在正確的方向* Warby你會看到許多答案,它只是把OP引向正確的方式,不直接給出「工作代碼「,因爲目標是向同行學習,而不是讓他人完成我們的工作。例如,參見[Q&A](http://stackoverflow.com/questions/19732777/is-jlist-override-the-list-automatic-bug)。 * PS:*謝謝@ChristianFries :) – dic19

0
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     label.setText(new Date().toString()); 
    } 
}, 1000, 1000); 

難道不是更簡單嗎?