2010-02-05 63 views
1

我將重構Swing應用程序從使用ActionListeners到Action類,因爲我意識到我的很多菜單項也將用於工具欄。如何從其他操作調用操作? (如果這是明智的)

現在我有一個名爲ImportExport的類,它處理底層模型的狀態,然後顯示適當的用戶對話框。 ImportExport具有功能save()saveAs()open()。當用戶點擊「打開」菜單項時,動作偵聽器首先調用open(),open()檢查模型是否有變化,如果是這種情況,則會顯示一個對話框詢問用戶是否想先保存。現在如果用戶點擊「是」open()調用save(),它再次執行一些檢查並顯示用戶對話框。 save()非常持久:離開此操作的唯一方法是通過成功保存或用戶決定要取消。我強烈依靠save()提供的反饋,如果用戶想取消,我也取消了調用open()函數。

我想給ImportExport類分成三類(OpenActionSaveAction & SaveAsAction),他們每個人的繼承AbstractAction並最終擺脫ImportExport類的。這就是我的問題出現的地方:如果用戶想在打開另一個模型之前保存模型,我該如何告知SaveAction執行?如果用戶決定取消,我該如何獲得反饋?

這是否是正確的方法?我不喜歡在保存和打開操作中有重複的代碼,並且我已經將盡可能多的功能放到了我的底層模型中,但用戶對話框在這裏顯然不合適,所以這是不行的。是Action設計在所有舉行這種功能或sould我只是保持我的ImportExport類,並簡單地委託所有的動作調用ImportExport適當的功能。你如何使用Actions

回答

2

我有時會在涉及決策樹時添加「控制器」操作。 OpenAction,SaveAction和SaveAsAction將繼承此控制器的Action。控制器動作將確定模型的狀態,並在適當的情況下請求來自用戶的更多信息,然後調用正確的子類。

1

我會創建一個ImportExportController類,有這些方法:open, save, saveAs。這個控制器會知道業務邏輯。我的Action類不會包含很多業務邏輯。他們只會打電話給控制器。

但這些措施將包括所有的標籤,圖標,加速器...這必須顯示在JButtonJMenuItem

對於我來說,Actions是面向類圖形用戶界面,用於方便(他們是非常方便!),但沒有專門處理業務邏輯的類。

相關問題