2011-03-01 83 views
1

對不起,標題很模糊,但我真的沒有拿出一個合適的標題。跟蹤Swing GUI「當前狀態」

我正在用Swing開發我的第一個應用程序,而且我很難弄清楚如何跟蹤應用程序的當前視圖。我的意思是當前視圖是例如如果一個按鈕已被推動。例如,在加載文件之前,您應該無法按下「執行」。我想出了一個非常糟糕的架構解決方案,我希望提示如何改進它。

我有一個名爲infoText的標籤,每次按下按鈕時都會更新。通過這個,我保持這個的fugly方式跟蹤應用程序的狀態:

if (infoText == LOADING_NARROW){ 
        printSelected(narrow_list); 
       }else{ 
        printSelected(list); 
       } 

回答

4

而不是保持與GUI組件的狀態的跟蹤,可使用普通的Java對象和變量。

只要在這種情況下保留boolean loadingNarrow,您可以在需要時參考和更新。

另外,如果由於按下按鈕而導致大負載運行,並且不希望用戶再次按下按鈕,則可以在負載啓動後禁用該按鈕,並在稍後重新啓用該按鈕。 (注意我假設你正在一個單獨的線程上運行加載,所以GUI不會凍結)。

+0

感謝您的回答。禁用按鈕,你的意思是setEnabled()方法嗎?是的,一個星期前我學會了單獨線程thingy ;-) – 2011-03-01 16:11:01

+0

@Emil,是setEnabled(),看看這裏的例子:http://download.oracle.com/javase/tutorial/uiswing/components/ button.html – jzd 2011-03-01 16:13:22

+0

我使用了setEnabled方法,它運行良好。特別好的是,按鈕在未啓用時會被遮蔽,因爲這會提高用戶友好度。 – 2011-03-02 09:44:06

2

Swing Components會記錄他們自己的狀態。

我的建議是:

  • 啓動應用程序爲默認狀態。
  • 以事件驅動的方式調整設置。例如,當單擊JButton A時,啓用JButton B和C並設置JTextField。
  • 用他們的內建方法檢查對象的狀態。例如 if((jButtonA.isEnabled() && jTextField.getText().equals("foobar"))

您還可以使用mediator pattern將相關的組件和他們的行動。

+0

謝謝,聽起來不錯。通過將應用程序啓動到默認狀態是什麼意思?其餘的我明白了。 – 2011-03-01 16:18:15

+0

@Emil我的意思是啓動在應用程序開始時有意義的任何組件設置 - 可見性,啓用等。例如,您提到在加載文件之前,您不應該能夠單擊「Execute」按鈕。因此啓動執行按鈕被禁用。 'executeButton.setEnabled(false);'然後當文件加載時,啓用按鈕'executeButton.setEnabled(true);'。希望這能說明問題。 – 2011-03-01 18:28:35

0

第一:他們是不同的方法,還是複製粘貼錯誤?

 printSelecteds (narrow_list); 
     printSelected (list); 

二:要禁用按鈕,您通常使用:

ok.setEnabled (false); 

如果文件被加載,你叫

ok.setEnabled (true); 

使JButton的 「OK」。

我不明白這與你的信息文本和你的printSelected(s)方法有什麼關係。如果你通過GUI傳遞狀態,由於競賽條件,你可能會失去一個或另一個。改變標籤可能是國家變革的下沉。

你可以有互斥位模式允許干擾:

FILE_OPEN = 1; 
SEARCHED = 2; 
FRIDAY = 4; 

添加它們按位:

state |= FRIDAY 

問他們,在二進制模式:

if (state | FILE_OPEN) .... 

它對我來說看起來不太優雅。我想我不確定你的問題是什麼。 :) 要觸發一個動作,如果按下某個按鈕,您必須實現一個actionListener,它也可以修改您的標籤。但swing的eventloop已經會檢查你的組件的狀態。你似乎部分複製了作品。