2009-04-17 31 views
53

我想知道是否有任何關於Java中聲明性GUI編程的建議。 (我厭惡基於視覺的GUI創建器/編輯器軟件,但是對手動實例化JPanels和Box以及JLabels和JLists等有點厭倦)。關於在Java中聲明性GUI編程的建議

這是我的總體問題,但我有兩個具體問題,的服用米思想:

  1. JavaFX的:有一個例子某處一個現實的GUI顯示的(例如,不圓和矩形,但列表框和按鈕和標籤等)中的JavaFX,它可以與一個Java接口訪問和更新各種元素的源文件?

  2. Plain Old Swing用來解析XUL-ish XML:有沒有人發明過用於Java Swing的XML聲明式語法(如XUL)?我想這並不難,可以創建一些基於STaX的代碼來讀取XML文件,實例化Swing元素的層次結構,並通過某種對象模型來訪問層次結構。但我寧願使用一些衆所周知的記錄和測試方法,而不是嘗試自己創造這樣的東西。

  3. JGoodies Forms - 不完全是說明性的,但有點接近&我已經與JGoodies Binding祝你好運。但他們的表單佈局語法看起來有點神祕。

編輯:很多偉大的答案在這裏! (&我上面加了#3)我特別感謝你聽到你們任何一個人在使用這些框架之一時遇到的實際應用的經驗。

p.s.我確實嘗試了幾次谷歌搜索(「java gui declarative」),只是不知道要尋找什麼。

+1

LOL - 不是關於JavaFX的 – willcodejavaforfood 2009-04-20 21:11:18

+0

耶一個答案,我注意到了。不完全給我溫暖的模糊感覺。雖然我嘗試了一些他們的示例代碼,它非常整潔。 – 2009-04-20 21:27:54

+0

我確實懷疑自己缺乏JavaFX評論。無論如何,對於以下所有內容和JavaFX(並且我們敢於包含XAML,XUL和wxWidgets ...) - 所有這些東西都需要像Ant這樣的工具,可以讓您在(widget)類中擴展工具。一些元件信息和'工具支持' – will 2013-05-12 11:16:24

回答

22

你可能會看看javabuilders;它使用YAML來構建Swing UI。

manual [PDF]一個簡單的例子:

JFrame: 
    name: myFrame 
    title: My Frame 
    content: 
     - JLabel: 
      name: myLabel2 
      text: My First Label 
     - JLabel: 
      name: myLabel2 
      text: My Second Label 

或者:

JFrame: 
    name: myFrame 
    title: My Frame 
    content: 
     - JLabel: {name: myLabel2, text: My First Label} 
     - JLabel: {name: myLabel2, text: My Second Label} 

甚至:

JFrame(name=myFrame,title=My Frame): 
    - JLabel(name=myLabel2, text=My First Label) 
    - JLabel(name=myLabel2, text=My Second Label) 
+1

我可能會用javabuilders去,它似乎在我的一些隱含標準下得分很高:體面的文檔/教程,全功能的(瓦特/綁定,佈局管理器鉤子等)。 – 2009-04-17 17:56:57

7

如果你願意在普通的Java之外略微放手一下,Groovy的「構建器」概念在GUI上工作得很好。當然你可以很容易地在Groovy和Java之間進行交互。有關更多信息,請參閱Swing Builder頁面。

+0

這是現在的[Griffon Framework](http://griffon-framework.org/) – 2015-08-29 08:53:27

2

Swiby試試:http://swiby.codehaus.org/

「Swiby是Swing和Ruby的混合體,用於真正豐富的分佈式應用程序。」 換句話說,Swiby是混合swing和ruby的領域特定語言。

0

由於經常,它總是執行一個好主意當你在尋找某物時進行搜索。 This是谷歌第一個鏈接,而尋找「的Java XML桂」

+2

好點。不過,你必須知道要搜索什麼。我搜索了「java聲明式gui」,不知道爲什麼我沒有考慮使用「xml」作爲搜索詞。 – 2009-04-17 16:59:49

+0

@Jason S:+1,我認爲說明谷歌搜索似乎不適合你,這是一個好主意,可以在提問時添加什麼信息。 – 2009-04-17 17:43:48

11

如果你可能要考慮雙支柱成語簡潔是非常重要的:

new JFrame("My Frame") {{ 
    setName("myFrame"); 
    add(new JLabel("My First Label") {{ 
     setName("myLabel2"); 
    }}; 
    add(new JLabel("My Second Label") {{ 
     setName("myLabel2"); 
    }}; 
}} 

然後,您不會失去任何的力量一個衆所周知的通用編程語言(你知道你會需要它,而JellyTags吸)。所有你需要的是一個額外的成語。

它並沒有太多用處,因爲實際上人們對XML的討厭並沒有解決真正的痛點。

通常,您可以使用構建器圖層來提取重複的代碼。 GUI代碼不一定要寫得很差,只是幾乎所有代碼都是(包括在教科書中)。

+3

呵呵 - 這實際上很漂亮。尼斯。 – 2009-04-18 05:12:13

+7

光滑和討厭之間有一條細線。 :) – 2009-04-18 05:24:49

+1

Eclipse將其重新格式化爲需要很多行的東西:( – 2010-04-26 23:35:07

10

我強烈建議MiG Layout - 需要幾天的時間才能習慣語法,但是一旦你掌握了它,它就會產生奇蹟。我使用JGoodies表單已經有一段時間了,Karsten的構建器概念運行良好,但它有點神祕... MiG更容易拾取,並且產生了非常簡潔的代碼。

+0

謝謝 - MMyers對Javabuilders的推薦也讓我變成了米格佈局。 – 2009-04-18 19:12:10

+0

我剛剛因爲MigLayout而使用了GUI構建器(VisualBuilder): – 2009-05-10 16:12:48

+2

看起來很整潔,有人甚至寫了一個clojure模塊來包裝它。感謝指針。 – 2009-05-28 12:52:56

1

儘管它不是聲明式的,並且僅限於佈局,但您可能想要看看DesignGridLayout,它允許以非常簡潔的方式(它是開源的)以編程方式定義Swing佈局。

主要優點:

  • 容易和快速學習。
  • 簡潔的代碼(在一個形式1行的每部件的 行代碼),也 使維修方便
  • 編譯時檢查(其 聲明性UI不能有)
  • 對於平臺外觀&的感覺 (基線對準, 部件之間的間隙...),沒有任何硬編碼 長度值
+1

@ Mahmoud-Aziz你可能不相信你不能在一個小時內使用它,但你真的嘗試過嗎?我無法相信你曾嘗試在一個小時內使用它:-)就我個人而言,我確認任何Swing開發人員可以在一小時後開始使用它(閱讀文檔,使用代碼完成,執行一些初始檢查並完成) 。請注意,我沒有提到你可以在一小時後做任何你想要的,更復雜的表單可能需要更多的時間... – jfpoilpret 2015-08-29 13:49:45

1

新的東西... XWT,將被包括在蝕E4

19

作爲CookSwing的作者,CookSwing是一款能夠滿足您需求的工具,在做實際實施之前,我已經對此主題進行了長時間的仔細審視。我寫了Java Swing GUI應用程序的生活。

IMO,如果您打算使用任何種類的命令式編程語言來描述Java Swing組件,那麼您不妨使用Java。 Groovy等僅僅增加了複雜性而沒有太多的簡化。

聲明性語言要好得多,因爲即使非程序員可以弄明白它,尤其是當你需要委派特定的佈局,以藝術家的微調的任務。由於簡單性,可讀性以及大量可用的編輯器/轉換工具等,XML對於聲明性語言(超過其他選擇)是完美的。

這裏有面臨聲明性GUI編程,不以任何特定次序的問題。 CookSwing已經解決了這些問題。

  1. 可讀性和簡單性。 (JavaFX是並不比XML簡單。XML的結束標記有助於閱讀了不少,並且不增加額外的打字很多,因爲XML編輯器通常爲你做)
  2. 可擴展性。非常重要,因爲自定義Swing組件會出現在任何不平凡的項目中。
  3. GUI佈局。也非常重要。能夠處理BorderLayout,GridBagLayout,JGoodies FormsLayout等實際上是必須的。
  4. 簡單的複製/粘貼。在設計佈局的過程中,有必要嘗試不同的佈局。所以人們需要能夠複製/粘貼和移動東西。 XML更好,因爲組件和佈局的層次結構很容易看到。由於多行屬性和縮進問題,JavaFX有些問題。有一個好的編輯器是必須的,並且有很多好的XML編輯器。
  5. 模板(即能夠包含另一個佈局文件)對於一致的外觀非常有用。例如,人們可能希望有對話,按鍵面板的外觀一致等使用Java代碼
  6. 相互作用。這是至關重要的。一些GUI組件只能使用Java代碼創建(無論出於何種原因)。因此有必要能夠加載這些對象。它也必然能夠直接連接XML代碼中的監聽器和其他Java對象/組件。使用ID將它們連接起來將不會很好,因爲它非常乏味。
  7. 國際化(i18n)。能夠從資源包中加載文本/字符串而不是硬編碼文本。此功能對於某些應用程序可能至關重要。
  8. 本地化(l10n)。聲明式編程(特別是XML)的優點是,您可以切換到特定區域設置的其他GUI形式,就是這樣。如果你使用Java或任何其他命令式語言編寫代碼,這並不容易。
  9. 錯誤檢查/容錯。初始設計通常會在這裏和那裏出現錯誤。有時候錯誤可能是因爲相應的Java代碼還沒有被設計。或者圖標資源丟失。用命令式編碼處理錯誤是非常乏味的。因此,希望能夠定位錯誤,但同時又具有容錯性,因此可以儘早進行GUI佈局的預覽。
  10. GUI組件更換。也就是說,將原來使用JTextField的文本字段替換爲一些更新的組件。用一些奇特的UI對話框(比如JIDE的)替換對話框的含義而不是JDialog。此功能可以節省大量的工作量。由於XSLT和其他轉換工具,XML本身也很有用。
  11. 超越鞦韆。因爲遲早你會發現許多組件配置使用對象類型,例如數組,圖標,圖像,向量等。
+0

有趣的...... – 2009-05-28 13:05:17

+7

「我有一個工具可以做到這一點,這裏是東西我不得不考慮「比」我有一個可以做到的工具,你應該使用它,因爲它很棒「。 +1 – MatrixFrog 2010-07-03 02:42:46

+0

+1體驗。 – 2010-07-03 10:13:50

2

SDL/Swing完全符合您的需求。它是一個小巧的(283k),不顯眼的,易於學習的聲明式Swing框架。

menus { 
    "File" { 
     "Open" do="open" // calls "open()" in the controller 
     "---" 
     "Exit" do="exit" 
    } 
} 

SDL/Swing是開源的,但享有商業支持。我們(Ikayzo.com)在數年的時間內開發出它,並將其部署到生命系統中,用於從生命科學公司到銀行的許多客戶。

0

WindowBuilder,這是一個非常不錯的插件,其中包括GWT,XWT,SWT,鞦韆等

1

我已經嘗試了許多解決方案,例如SWIXML,Javabuilders,MigLayout,Cookswing。我終於找到了javaFX和javaFX-Scenebuilder最好的最快解決方案,基於XML的GUI工具。你會喜歡scenebuilder創建GUI的方式(拖動&拖放項目!)。另外,它使用CSS(層疊樣式表)作爲GUI主題。 Jsut信任Oracle,它是Java應用程序的最佳GUI工具。 坐遊覽車與scenebuilder創建JavaFX的應用,在這裏: http://docs.oracle.com/javafx/scenebuilder/1/get_started/prepare-for-tutorial.htm#CEGJBHHA