簡體   English   中英

高級應用程序中的JButton如何工作?

[英]How do JButtons in advanced applications work?

用Java編寫的軟件中的按鈕如何工作?

http://i.stack.imgur.com/fCbRQ.png

例如上面的屏幕截圖:當用戶單擊不同的按鈕時,對用戶輸入的數據(這是一個數據分析應用程序)運行不同的算法,並顯示輸出。 不過,剛開始編寫Java GUI的時候,對我來說,這似乎就像魔術一樣-每個窗格都有一個ActionListener嗎? 它是否監聽不同按鈕的不同ActionCommand並在actionPerformed()方法內執行算法(對我來說,以獨立於數據的方法執行算法似乎有點不直觀...即按鈕不知道什么它正在處理的數據?)。 到目前為止,我在網上閱讀的所有動作偵聽器教程都僅在按下按鈕時才打印出一些內容...

連接按鈕,動作監聽器和在后台執行的實際動作的一般結構是什么?

提前致謝。

通常的方法是每個按鈕有一個動作監聽器。 Statistics面板可以訪問(通過其字段之一)需要讀取和修改的數據。 因此,此面板中第一個按鈕的處理如下所示:

private void initButtonListeners() {
    this.averageDegreeButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            computeAverageDegree();
        }
    }

    // other buttons...
}

而且computeAverageDegree()方法看起來像

private void computeAverageDegree() {
    double result = this.statistics.computeAverageDegree();
    this.averageDegreeLabel.setText(formatDoubleToString(result));
}

我個人的喜好是在UI中幾乎不執行任何操作,而是將所有操作移至模型/控制器端(不確定最好的名字是什么,因為它很少是純MVC)。

我認為您在用戶界面中所做的所有事情也應該可以通過API來完成。 好處是易於測試,可以重新設計UI,而不會弄亂您的邏輯,易於在后台線程上執行繁重的工作,...。

拙劣的對話框文章很好地描述了這一點。 並非特定於Swing,但適用於所有類型的UI。

要回答您的問題:

每個窗格都有一個ActionListener嗎?

不,通常每個按鈕都有一個Action (或ActionListener )。 我更喜歡使用Action實例,因為它們比典型的匿名ActionListener更可重用(並且也更易於測試)

它是否監聽不同按鈕的不同ActionCommand並在actionPerformed()方法內執行算法

當然不是。 在該方法中進行大量計算將阻塞Swing UI線程(事件調度線程),這會導致在進行計算時UI不響應。 顯示進度也變得不可能。 計算通常是在工作線程上完成的,該工作線程是在觸發您的Action啟動的(例如,使用SwingWorker )。 Swing中的並發教程對此進行了說明。

在我看來,以獨立於數據的方法執行算法有點不直觀……即按鈕不知道它正在處理什么數據?

該按鈕不應該知道數據。 數據通常存儲在模型中。 UI僅顯示它,但不包含它(除非它只是由用戶提供的輸入)。 該按鈕應該只知道在模型上調用什么。 該模型將執行其所有操作並觸發一個事件。 UI拾取該事件並進行自我更新。

至少,這就是Swing的設計方式(例如JTable及其TableModel )。 我沒有充分的理由在制作自己的Swing UI時不遵循該模型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM