使用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...
相关文章
相关标签/搜索