2013年5月5日 星期日

UI Framework in JAVA Swing


   什麼要討論已經過時以久的UI系統Swing呢?除了詭異帶點醜陋的UI元件、有點難以理解的 Layout系統、殘缺不堪的元件模組(想找個類似Android的ListView卻找不到);但它還是JAVA Desktop Application的首選(JDK/JRE Default就有的功能,相較於JavaFX,需要額外下載一包Runtime);很不幸的,我們只是需要一個皮(View)替演算法的細節視覺化,同時能夠做簡單的操作達到說明的效果,最後只好乖乖使用Swing這種old style的framework。

   用Swing拉Layout可以用Netbean IDE,但對於動態生成的情境卻是弱的可以(Android的ADT在11版就有支援),但Netbean說起來也只是幫您自動長出那些噁心的Layout Code,換句話說之後微調或修改還是需要直接碰到Source Code,而不是修改Configuration(Android的話就是layout.xml)就能直接使用;好在心灰意冷之餘,同事推薦了JavaBuilders,它把描述UI這件事情變成Yaml,並且引入別牌的LayoutManager : MigLayout,以下是官方的範例Code

 JPanel:  
   - JSplitPane(name=split1):  
     - JPanel:  
       - JPanel(name=p1,groupTitle=Titled Border): [JLabel(text=Groupbox border)]  
       - JPanel(name=p2,border=raisedEtched): [JLabel(text=Raised etched border)]  
       - JPanel(name=p3,border=loweredEtched): [JLabel(text=Lowered etched border)]  
       - JPanel(name=p4,border=raisedBevel): [JLabel(text=Raised bevel border)]  
       - JPanel(name=p5,border=loweredBevel): [JLabel(text=Lowered bevel border)]  
       - JPanel(name=p6,border=1): [JLabel(text=1 px wide border with default color)]  
       - JPanel(name=p7,border=4): [JLabel(text=4 px wide border with default color)]  
       - JPanel(name=p8,border=olive 4): [JLabel(text=4 px wide border with olive color)]  
       - JPanel(name=p9,border=orange 4): [JLabel(text=4 px wide border with orange color)]  
       - MigLayout(layoutConstraints="wrap 1"): [p1,p2,p3,p4,p5,p6,p7,p8,p9]  
     - JPanel(name=sourcePanel):  
       - JLabel(name=sourceLbl,text="YAML source:")  
       - JScrollPane(name=scroll1): JTextArea(name=source,editable=false,font=Monospaced)  
       - MigLayout: |  
         [grow]  
         sourceLbl  
         scroll1  [grow]  
   - MigLayout: |  
      [grow]  
      split1 [grow]    
 bind:  
   - source.text: this.yaml  

   JFrame/JPanel就會對應到檔案名稱相同的Yaml檔,雖然無法臻至完美,但也算是個區域最佳解,為Swing的MVC架構向前一大步。


(迷之聲:那麼難用的UI Framework不如直接寫Android!)

沒有留言:

張貼留言