使用XML构建Swing应用

43次阅读

共计 2245 个字符,预计需要花费 6 分钟才能阅读完成。

原文地址:

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


不得不说 Swing 是 Java 中 GUI 编程中 1 个不错的包, 但是手动编写 Swing 是 1 个很繁琐的事情。而与其他 GUI 工具相比, 比如 Qt, 可使用 Qt Designer 来进行页面绘制。

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 字符串:

<?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 文件进行加载:

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 界面。如下所示:

实际上其原理就是使用 Java 中的 JavaBean 来实现, 类似的还有 Spring。当然这里比较简单, 当然也可以通过反射及 DI 的方式自行实现自定义 XML 文件时生成对应的对象。
不得不说, 这个过程比编写 swing 代码还繁琐。因此还是借助于一些开源的项目来完成这个需求吧, 比如 XUL。
最后, 是 Java 中一些开源 XML 的 UI 工具库, 当然大部分都已经死掉了要么就是不更新了:

  • Luxor
  • SwiXml
  • XUI
  • jXUL
  • Laszlo

详情可以参考。

结语

由于 GUI 编程现在并不再流行, 没什么事情最好还是尽量使用 HTML 来完成页面布局。对于简单的需求, 花费的精力和时间会少很多。当然, 对于复杂的情况, 建议还是使用 Qt、Wx 之类或其他商业 GUI 工具完成。

参考文章:

https://www.oracle.com/techne…

正文完
 0