使用XML構建Swing應用

原文地址:html

http://blog.52sox.com/Java-us...

不得不說Swing是Java中GUI編程中1個不錯的包,可是手動編寫Swing是1個很繁瑣的事情。而與其餘GUI工具相比,好比Qt,可以使用Qt Designer來進行頁面繪製。java

1個天真的想法

因而,便想到能不能經過XML的方式來構建Swing應用呢?下面是1個簡單嘗試的過程,假設咱們經過以下的代碼生成1個簡單的例子:編程

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {
    static final int WIDTH = 300;
    static final int HEIGHT = 100;
    public static void main(String[] args) {
        JFrame frame = new JFrame("測試");
        frame.setSize(WIDTH, HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        JLabel label = new JLabel("Hello,Swing");
        frame.add(label);
    }
}

說得再多不如作得多

爲了動態根據XML生成上述代碼,咱們可使用XMLEncoder對其進行序列化,能夠獲得相似以下的XML字符串:oracle

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0" class="java.beans.XMLDecoder">
    <object class="javax.swing.JFrame">
        <string>測試</string>
        <void property="size">
            <object class="java.awt.Dimension" id="Dimension0">
                <void class="java.awt.Dimension" method="getField">
                    <string>width</string>
                    <void method="set">
                        <object idref="Dimension0" />
                        <int>300</int>
                    </void>
                </void>
                <void class="java.awt.Dimension" method="getField">
                    <string>height</string>
                    <void method="set">
                        <object idref="Dimension0" />
                        <int>100</int>
                    </void>
                </void>
            </object>
        </void>
        <void method="add">
            <object class="javax.swing.JLabel">
                <string>Hello,Swing</string>
            </object>
        </void>
        <void property="defaultCloseOperation">
            <int>3</int>
        </void>
        <void method="pack" />
        <void property="visible">
            <boolean>true</boolean>
        </void>
    </object>
</java>

其中根節點必須爲java,該對象有1個object節點表示其爲1個對象,其中的class屬性指定須要引入的類,而method屬性表示須要調用的方法。對於參數,可使用Java基本類型來表示。
以後咱們編寫1個測試類,對上述XML文件進行加載:app

import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class SwingGUI {
    static String filename = "swing.xml";
    public static void main(String[] args) {
        XMLDecoder decoder = null;
        try {
            decoder = new XMLDecoder(new BufferedInputStream(new FileInputStream(filename)));
            decoder.readObject();
            
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            if(decoder!=null) {
                decoder.close();
            }
        }
    }
}

當運行這個測試類後就會發現,咱們獲得了相同的GUI界面。以下所示: 工具

GUI

實際上其原理就是使用Java中的JavaBean來實現,相似的還有Spring。固然這裏比較簡單,固然也能夠經過反射及DI的方式自行實現自定義XML文件時生成對應的對象。
不得不說,這個過程比編寫swing代碼還繁瑣。所以仍是藉助於一些開源的項目來完成這個需求吧,好比XUL。
最後,是Java中一些開源XML的UI工具庫,固然大部分都已經死掉了要麼就是不更新了:佈局

  • Luxor
  • SwiXml
  • XUI
  • jXUL
  • Laszlo

詳情能夠參考測試

結語

因爲GUI編程如今並再也不流行,沒什麼事情最好仍是儘可能使用HTML來完成頁面佈局。對於簡單的需求,花費的精力和時間會少不少。固然,對於複雜的狀況,建議仍是使用Qt、Wx之類或其餘商業GUI工具完成。 ui

參考文章:spa

https://www.oracle.com/techne...
相關文章
相關標籤/搜索