前些日子,我提了一个问题,就是从cs的界面中导出xml文件。现在经过努力,我能够做出一点东西出来。不过没有逃出.net的“控件树”这个概念。代码如下:

解决方案 »

  1.   

    //***** 是一个界面
    package frame;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Font;import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;public class OneFrame extends JFrame
    {
    public static final long serialVersionUID = 0;
    public OneFrame()
    {

    setSize(400, 400);// 设置框架的大小
    setTitle("学生管理系统");// 设置框架的标题
    setResizable(true); JPanel titlePanel = new TitlePanel();
    JPanel midPanel   = new MiddlePanel();
    Container con = getContentPane();
    con.add(titlePanel, BorderLayout.NORTH);
    con.add(midPanel,BorderLayout.CENTER);
    }

    public static void main(String[] args)
    {
    OneFrame frame = new OneFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GetFrameXml(frame);
    frame.setVisible(true);
    }

    private static void GetFrameXml(JFrame f)
    {
    ReadFrame rf = new ReadFrame(f);
    System.out.print(rf.GetFrameXml());
    System.out.println(rf.GetFrameXmlDoc());
    }
    }
    class TitlePanel extends JPanel
    {
    public static final long serialVersionUID = 1;
    public TitlePanel()
    {
    JLabel titleLabel = new JLabel("学 生 管 理 系 统");
    titleLabel.setPreferredSize(new Dimension(190, 50));
    titleLabel.setForeground(new Color(204, 0, 153));
    Font titleLabelFont = new Font("Dialog", Font.BOLD, 24);
    titleLabel.setFont(titleLabelFont);
    add(titleLabel);
    }
    }
    class MiddlePanel extends JPanel
    {
    public static final long serialVersionUID = 2;
    public MiddlePanel()
    {
    JButton left = new JButton("left");
    JButton mid  = new JButton("mid");
    JButton right= new JButton("right");
    Box box = Box.createHorizontalBox();
    box.add(left);
    box.add(mid);
    box.add(right);

    add(box);
    }

    }
      

  2.   

    //********** 写xml
    package frame;import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.StringWriter;import javax.swing.JFileChooser;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Text;public class WriteXml
    {
    private DocumentBuilderFactory factory;
    private DocumentBuilder builder;
    private Document doc;
    public Element root;

    public WriteXml(String rootname)
    {
    factory = DocumentBuilderFactory.newInstance();
    try
    {
    builder = factory.newDocumentBuilder();
    doc = builder.newDocument();
    root = doc.createElement(rootname);
    }
    catch (ParserConfigurationException e)
    {
    e.printStackTrace();
    }
    }
    public WriteXml()
    {
    factory = DocumentBuilderFactory.newInstance();
    try
    {
    builder = factory.newDocumentBuilder();
    doc = builder.newDocument();
    }
    catch (ParserConfigurationException e)
    {
    e.printStackTrace();
    }
    }
    /**
     * 写根节点
     * @param rootname 根节点名
     * @return
     */
    public Element WriteRootElement(String rootname)
    {
    root = doc.createElement(rootname);
    return root;
    }
    /**
     * 写XML文档
     * @return
     */
    public Document WriteXMLDocument()
    {
    doc.appendChild(root);
    return doc;
    }
    /**
     * 写一般节点
     * @param elementname 节点名
     * @return
     */
    public Element WriteCommonElement(String elementname)
    {
    Element ele = doc.createElement(elementname);
    return ele;
    }
    /**
     * 写节点与节点的上下级关系
     */
    public Element WriteElementLayle(Element child,Element parent)
    {
    parent.appendChild(child);
    return parent;
    }
    /**
     * 节点文本
     * @param text 文本内容
     * @return
     */
    public Text WriteTextElement(String text)
    {
    Text t = doc.createTextNode(text);
    return t;
    }
    /**
     * 节点属性
     * @param e 节点
     * @param attributename 属性名
     * @param attributetext 属性内容
     * @return
     */
    public Element WriteElementAttribute(Element e,String attributename,String attributetext)
    {
    e.setAttribute(attributename, attributetext);
    return e;
    }

    public String GetDocument()
    {
    //写xml文件时,这个是必须的套式
    StringWriter sw = new StringWriter();
    try
    {
    Transformer t = TransformerFactory.newInstance().newTransformer();

    StreamResult sr = new StreamResult(sw);
    t.transform(new DOMSource(doc),sr);
    }
    catch(TransformerConfigurationException e)
    {
    e.fillInStackTrace();
    }
    catch(TransformerException e)
    {
    e.fillInStackTrace();
    }
    finally
    {
    return sw.toString();
    }
    }
    }
      

  3.   

    //********** 读取界面信息
    package frame;import java.awt.Component;import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JLayeredPane;
    import javax.swing.JPanel;
    import javax.swing.JRootPane;import org.w3c.dom.Document;
    import org.w3c.dom.Element;public class ReadFrame
    {
    /**
     * 要读取控件的Frame
     */
    private JFrame aFrame;
    private WriteXml w_xml;
    public ReadFrame(JFrame frame)
    {
    aFrame = frame;
    w_xml = new WriteXml();
    }

    /**
     * 还是以“控件树”为雏型,读取界面上的控件
     * @param c
     * @return
     */
    public String GetFrameXml(Component[] c)
    {
    String xml = new String();
    for(int i=0;i<c.length;i++)
    {
    System.out.println(c[i].getClass().toString());
    xml += FrameXml(c[i]);
    }
    return xml;
    }
    /**
     * 还是以“控件树”为雏型,读取界面上的控件
     * @param c
     * @return
     */
    public String GetFrameXml()
    {
    Component[] c = aFrame.getComponents();
    String xml = new String();
    for(int i=0;i<c.length;i++)
    {
    System.out.println(c[i].getClass().toString());
    xml += FrameXml(c[i]);
    }
    return xml;
    }
    /**
     * xml文档
     * @param c
     * @return
     */
    private String FrameXml(Component c)
    {
    System.out.println(c.getClass().getName());
    String xml = "";
    if(c instanceof JRootPane)
    {
    JRootPane jp = (JRootPane)c;
    if(jp.getComponentCount() > 1)
    {
    System.out.println(jp.getComponentCount());
    xml += GetFrameXml(jp.getComponents());
    }
    else
    {
    System.out.println("JRootPane:" + jp.getComponentCount());
    return xml;
    }
    }
    else if(c instanceof JLayeredPane)
    {
    JLayeredPane jp = (JLayeredPane)c;
    if(jp.getComponentCount() > 1)
    {
    System.out.println(jp.getComponentCount());
    xml += GetFrameXml(jp.getComponents());
    }
    else
    {
    System.out.println(jp.getComponentCount());
    if(jp.getComponentCount() > 0)
    {
    System.out.println(jp.getComponent(0).getClass().getName());
    xml += FrameXml(jp.getComponent(0));
    }
    }
    }
    else if(c instanceof JLabel)
    {
    JLabel jl = (JLabel)c;
    xml = String.format("<JLable text='%s'>%s</JLable>",jl.getText(),c.getClass().getName());
    }
    else if(c instanceof JButton)
    {
    JButton jb = (JButton)c;
    xml = String.format("<JButton text='%s'>%s</JButton>",jb.getText(),c.getClass().getName());
    }
    else if(c instanceof JPanel)
    {
    JPanel jp = (JPanel)c;
    xml = GetFrameXml(jp.getComponents());
    }
    else if(c instanceof Box)
    {
    Box box = (Box)c;
    xml = GetFrameXml(box.getComponents());
    }
    return xml;
    }
    //*************************************
    //*************************************
    public String GetFrameXmlDoc()
    {
    Component[] c = aFrame.getComponents();
    w_xml.WriteRootElement("root");
    w_xml = GetFrameXmlDoc(c,w_xml.root);
    w_xml.WriteXMLDocument();
    return w_xml.GetDocument();
    }
    private WriteXml GetFrameXmlDoc(Component[] c,Element parent)
    {
    for(int i=0;i<c.length;i++)
    {
    System.out.println(c[i].getClass().toString());
    w_xml = FrameXmlDoc(c[i],parent);
    }
    return w_xml;
    }
    private WriteXml FrameXmlDoc(Component c,Element parent)
    {
    System.out.println(c.getClass().getName()); 
    Element e = parent;
    if(c instanceof JRootPane)
    {
    JRootPane jp = (JRootPane)c;
    if(jp.getComponentCount() > 1)
    {
    System.out.println(jp.getComponentCount());
    w_xml = GetFrameXmlDoc(jp.getComponents(),parent);
    }
    else
    {
    System.out.println("JRootPane:" + jp.getComponentCount());
    return w_xml;
    }
    }
    else if(c instanceof JLayeredPane)
    {
    JLayeredPane jp = (JLayeredPane)c;
    if(jp.getComponentCount() > 1)
    {
    System.out.println(jp.getComponentCount());
    w_xml = GetFrameXmlDoc(jp.getComponents(),parent);
    }
    else
    {
    System.out.println(jp.getComponentCount());
    if(jp.getComponentCount() > 0)
    {
    System.out.println(jp.getComponent(0).getClass().getName());
    w_xml = FrameXmlDoc(jp.getComponent(0),parent);
    }
    else
    return w_xml;
    }
    }
    else if(c instanceof JLabel)
    {
    JLabel jl = (JLabel)c;
    e = w_xml.WriteCommonElement("JLabel");
    e.appendChild(w_xml.WriteTextElement(c.getClass().getName()));
    e = w_xml.WriteElementAttribute(e,"text",jl.getText());
    parent = w_xml.WriteElementLayle(e, parent);
    }
    else if(c instanceof JButton)
    {
    JButton jb = (JButton)c;
    e = w_xml.WriteCommonElement("JButton");
    e.appendChild(w_xml.WriteTextElement(c.getClass().getName()));
    e = w_xml.WriteElementAttribute(e,"text",jb.getText());
    parent = w_xml.WriteElementLayle(e, parent);
    }
    else if(c instanceof JPanel)
    {
    JPanel jp = (JPanel)c;
    String name = c.getClass().getName();
    name = name.substring(name.lastIndexOf(".") + 1);
    e = w_xml.WriteCommonElement(name);
    w_xml.WriteElementLayle(e, parent);
    w_xml = GetFrameXmlDoc(jp.getComponents(),e);
    }
    else if(c instanceof Box)
    {
    Box box = (Box)c;
    e = w_xml.WriteCommonElement("Box");
    w_xml.WriteElementLayle(e, parent);
    w_xml = GetFrameXmlDoc(box.getComponents(),e);
    }
    return w_xml;
    }
    }
      

  4.   

    请问你看过jdom没?
    我前几天试了一下
    我觉得如果可以使用这个的话可能更简单写~~~
    你也试一下,嘿嘿~~