簡體   English   中英

在Java Swing中將域與用戶界面分開

[英]Separate user interface from domain in java Swing

作為Java Swing的新手,我在將用戶界面邏輯與域邏輯分離時遇到了一些麻煩。

我有一個小的(瑣碎的?)Swing應用程序,其中包含一個JLrame,包含一個JLabel,JTextField和一個JButton。 按下JButton時會彈出一個JFileChooser對話框。 選擇文件后,JTextField包含文件的絕對路徑。 到目前為止還沒有什么壯觀的景象。 接下來我想要完成的是將文件的絕對路徑“注入”文件管理器類,該類將在進行選擇並更新JTextField時處理文件的實際處理(每次選擇文件時)使用JButton)。

我有的問題:

  1. 如何讓文件管理器知道何時開始讀取文件? (例如,計算該文件中的行數)
  2. 如何以在UI層中共享最少信息的方式實現域層? 我應該在UI中添加filemanager實例嗎?
  3. 我應該使用JTextField的值作為文件管理器的引用,還是應該使用JButton操作將值設置到文件管理器中? 我的意思是:使用JTextField的propertychangelistener或使用JButton的actionlistener?
  4. 我應該使用filebean來存儲域層中文件的絕對路徑,還是直接將其插入文件管理器? 不同之處在於:當我使用屬性更改偵聽器時,可以在UI輸入更改時更新絕對文件路徑的值,但是當我使用構造函數或setter直接插入值時,我必須處理文件管理器中的更改而不是處理filebean中的更改。
  5. 如何在域邏輯中引用文件管理器中UI中使用的filebean?
  6. 域邏輯是否與業務邏輯相同? 我的意思是:文件管理器類應該在包中的what.b-logic和filebean類應該在包中的whatever.domain ??

該應用程序分為幾個包:

  • 無論如何:主要階級
  • 無論如何:搖擺的東西
  • whatever.domain:數據的東西
  • whatever.logic:應用程序邏輯

我希望我足夠清楚......

提前謝謝清理。

就個人而言,當我處理這些問題時,我會嘗試將可重用性和責任(誰負責什么)視為主要要求。

也就是說,我嘗試讓我的模型設置在這樣的位置,這樣他們就不關心數據來自或去往的方式和位置,它們簡單地提供了接口訪問以實現它。

要將所有元素連接在一起,我依靠模型將事件提供給客戶端,因為模型不應該關心誰想知道,只需提供所需的功能。 所以,為了向客戶提供反饋,我依靠一系列的聽眾。

我會將監聽器分解為特定的工作,例如文件讀取的通知將是它自己的監聽器,對模型的更改(添加/刪除/更新)文件bean將是另一個。 其他通知將需要不同的偵聽器,這將阻止您創建實現並不真正想要了解的怪物偵聽器。

為了在模型中設置值,我會在屬性設置器/ getter一側犯錯。 這會將您的模型與實現分離(如果您以自動方式使用模型,該怎么辦?)

如果可能,內部數據最好由模型管理。 也就是說,如果更改模型正在管理的文件bean上的屬性,則模型應該能夠監視更改並處理它。 話雖如此,您可能在將來的某個時間想要一個愚蠢的模型,您可以批量更新一系列文件bean,然后讓模型自行更新。

我個人可能會提供模型在外部更新的方法,同時提供至少一個能夠提供自我監控的實現,這使您可以靈活地為正確的情況選擇正確的模型。

此處還存在內存泄漏的危險。 如果在不再需要文件bean時沒有從文件bean中正確刪除任何偵聽器,最終可能會阻止該bean在以后被垃圾回收。

盡可能使用接口。 在嘗試將這些模型組合在一起時,這提供了很大的靈活性。

對於您所描述的內容,我將允許文件管理器負責文件管理器,以便文件管理器成為文件bean的容器。

根據項目的大小以及將來如何重用代碼將極大地影響代碼的布局。

我通常把UI代碼放在UI包和子包中,但那只是我。 我傾向於將界面內容與實現內容分開(通常在物理上在單獨的Jar文件中,但同樣,那就是我)。 這意味着我只需要包含接口庫以及我可能正在使用的實現,使用某種工廠來實際實例化實現(如果需要)(或直接根據需要)。 以JDBC驅動程序為例。

你想看看球體的責任。 根據您的描述,我覺得文件bean屬於文件管理器的責任范圍,因此我將兩者綁定在一起。

這只是我的觀點

以下是一些建議:

  • 使用這里所示的SwingWorker ,在監聽進度的同時保持GUI的活潑。

  • 使用此處說明的Action來封裝功能。

  • 使用File ,一種方便的跨平台抽象。 使用它來構建新的抽象,而不是拉出非跨平台的部分。

附錄:另請參閱Swing架構概述答案

暫無
暫無

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

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