【Java】通过读取XML配置,创建GUI界面

【Java】通过读取XML配置,创建一个GUI界面

XML配置文件如下:

  • 在项目根目录创建XML文件,名字为“ui.xml”
    【Java】通过读取XML配置,创建GUI界面_第1张图片
  • 用记事本打开,修改其内容如下并保存:

<frame name="GUI界面测试" center="true" visible="true" resizable="true" alwaysOnTop="true" close="true" left="0" top="0" width="1000" height="618">
    
        

以下是Java代码:

package guiXML;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * 通过解析XML文件中的相关配置,创建相应的窗体以及组件
 * @author 曾经的你
 * @version 1.0
 * @contact QQ:2535141917
 * @time 2019年7月12日11点10分
 */
public class XML_GUI {
    private Document doc;//xml文件树形结构

    static public void main(String[]args){
       new XML_GUI();
    }

    private XML_GUI(){
        this.theJFrame();
    }

    /**
     * 解析XML文件
     * @param fileName 文件路径
     * @return Document对象
     */
    private Document parseXML (String fileName){
         doc = new Document();
        SAXBuilder bSAX = new SAXBuilder(false);
        try {
            doc = bSAX.build(new File(fileName));
        }
        catch (JDOMException | IOException e) {
            e.printStackTrace();
        }
        return doc;
    }

    /**
     * 创建一个窗体
     * @param center true 在屏幕中心 false 自定义位置
     * @param visible true 可见 false 不可见
     * @param resizable true 可调整大小 false 不可调整大小
     * @param alwaysOnTop true 永远置顶
     * @param close true 和进程一起关闭
     * @param left 据屏幕左侧距离
     * @param top 据屏幕顶部距离
     * @param width 窗体宽度
     * @param height 窗体高度
     * @param name 窗体标题
     * @return JFrame一个窗体
     */
    private JFrame createJFrame(boolean center, boolean visible, boolean resizable, boolean alwaysOnTop, boolean close, int left, int top, int width, int height, String name) {


        JFrame jFrame = new JFrame(name);

        if(center) {
            Toolkit theKit = jFrame.getToolkit();
            Dimension wndSize = theKit.getScreenSize();
            jFrame.setBounds(wndSize.width/2-width/2,wndSize.height/2-height/2,width,height);//窗口在屏幕中心显示
        }
        else {
            jFrame.setBounds(left,top,width,height);
        }

        jFrame.setVisible(visible);
        jFrame.setResizable(resizable);
        jFrame.setAlwaysOnTop(alwaysOnTop);

        if(close) {
            jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
        return jFrame;
    }

    /**
     * 创建一个JPanel
     * @param visible true 可见    false 不可见
     * @param Layout 布局管理
     * @return JPanel一个容器
     */
    private JPanel createJPanel(boolean visible, String Layout){

        JPanel jPanel = new JPanel();
        jPanel.setVisible(visible);

        if(0 == Layout.compareTo("BorderLayout")){//暂时只写了一种边界布局
            jPanel.setLayout(new BorderLayout());
        }
        jPanel.setBackground(Color.green);
        return jPanel;
    }

    /**
     * 创建一个JButton
     * @param enable true 可用
     * @param name 按钮文字
     * @return JButton一个按钮
     */
    private JButton createJButton(boolean enable, String name){
        JButton jButton = new JButton(name);
        //jButton.setBounds(left,top,width,height);
        jButton.setEnabled(enable);
        jButton.addActionListener(e -> System.out.println("The button you click is "+name+'.'));//一个简单的监听器
        return jButton;
    }

    /**
     * 刷新创建好的窗体
     */
    private void theJFrame() {
      addJFrame().revalidate();
    }

    /**
     * 从XML文件读取配置创建窗体
     * @return JFrame一个窗体
     */
    private JFrame addJFrame(){
        doc = parseXML("ui.xml");
        Element root = doc.getRootElement();
        List panelList = root.getChildren("panel");

        JFrame jFrame= createJFrame(
                Boolean.parseBoolean(root.getAttribute("center").getValue().trim()),
                Boolean.parseBoolean(root.getAttribute("visible").getValue().trim()),
                Boolean.parseBoolean(root.getAttribute("resizable").getValue().trim()),
                Boolean.parseBoolean(root.getAttribute("alwaysOnTop").getValue().trim()),
                Boolean.parseBoolean(root.getAttribute("close").getValue().trim()),
                Integer.parseInt(root.getAttribute("left").getValue().trim()),
                Integer.parseInt(root.getAttribute("top").getValue().trim()),
                Integer.parseInt(root.getAttribute("width").getValue().trim()),
                Integer.parseInt(root.getAttribute("height").getValue().trim()),
                root.getAttribute("name").getValue().trim());
        for (int i=0; i < panelList.size() ; i++) {
            jFrame.add(addJPanel(panelList,i));
        }
        return jFrame;
    }

    /**
     *从XML文件读取配置创建容器
     * @param panelList 文件中的容器列表
     * @param i 创建第j个容器
     * @return JPanel一个容器
     */
    private JPanel addJPanel(  List panelList,int i){

        Element element = (Element)panelList.get(i);
        List buttonList = element.getChildren("button");
        JPanel jPanel = createJPanel(Boolean.parseBoolean(element.getAttribute("visible").getValue().trim()),
                                     element.getAttribute("Layout").getValue().trim());
        for(int j = 0;j<buttonList.size();j++) {
            Element element_but = (Element)buttonList.get(j);
            jPanel.add(element_but.getAttribute("position").getValue().trim(),addJButton(buttonList,j));
        }
      return jPanel;
    }

    /**
     * 从XML文件读取配置创建按钮
     * @param buttonList 文件中的按钮表
     * @param j 创建第j个按钮
     * @return JButton一个按钮
     */
    private JButton addJButton(List buttonList,int j){
                Element element = (Element) buttonList.get(j);
        return createJButton(Boolean.parseBoolean(
                element.getAttribute("enable").getValue().trim()),
                element.getAttribute("name").getValue());
            }
    }

你可能感兴趣的:(Java,XML)