利用反射机制获得JavaBean的属性,然后生成一个XML文件.
//XmlFrame.java package xmlgen.gui;
import java.awt.*; import javax.swing.*;
public class XmlFrame extends JFrame{ public XmlFrame(){ this.setTitle("Xml Generator"); Toolkit kit=Toolkit.getDefaultToolkit(); Dimension d=kit.getScreenSize(); int width=d.width; int height=d.height; this.setLocation((width-800)/2,(height-600)/2); this.setSize(800,600); this.setContentPane(new XmlPanel()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.show(); } public static void main(String[] args){ new XmlFrame(); } }
//XmlPanel.java
package xmlgen.gui;
import java.awt.*; import javax.swing.*; import java.awt.event.*; import javax.swing.event.*; import java.util.*; import xmlgen.core.*;
public class XmlPanel extends JPanel{ private JPanel midPane,classPane,propertyPane,elementPane; private JPanel xmlPane; private JTextArea xmlContent; private JTextField txtPackage,txtClass,txtRoot,txtElement,txtProperty; private JLabel lblPackage,lblClass,lblRoot,lblElement; private JButton btnClass,btnDelPro,btnAddElement,btnDelElement,btnGen; private JList lstClass,lstXml; private DefaultListModel lmClass,lmXml;
private void init(){ this.setLayout(new BorderLayout()); classPane=new JPanel(); classPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("类全名"), BorderFactory.createEmptyBorder(5,5,5,5))); this.lblPackage=new JLabel("类包名:"); this.lblClass=new JLabel("类名:"); this.txtPackage=new JTextField(20); this.txtClass=new JTextField(20); this.btnClass=new JButton("获得属性"); this.btnClass.setEnabled(false); this.btnClass.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ String fullName=txtPackage.getText().trim()+"."+txtClass.getText().trim(); Class c=null; xmlContent.setText(""); lmClass.clear(); try{ c=Class.forName(fullName); } catch(ClassNotFoundException ex){ xmlContent.setText("找不到指定的类,请确保环境变量设置正确"); return; } java.util.List list=Generator.getProperties(c); for(int i=0;i<list.size();i++) lmClass.addElement(list.get(i)); if(lmClass.size()==0) xmlContent.setText("找不到任何属性"); } } ); this.txtClass.getDocument().addDocumentListener( new AddTextListener(this.btnClass)); classPane.add(this.lblPackage); classPane.add(this.txtPackage); classPane.add(this.lblClass); classPane.add(this.txtClass); classPane.add(this.btnClass); /******************************************************************* */ propertyPane=new JPanel(new BorderLayout()); propertyPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("Bean 属性"), BorderFactory.createEmptyBorder(5,5,5,5))); this.lmClass =new DefaultListModel(); lmClass.addElement("这里是Bean的属性"); lmClass.addElement("点击上面的按钮可以生成"); lmClass.addElement("右边是XML中的属性"); lmClass.addElement("可以删除不必要的"); this.lstClass=new JList(this.lmClass); this.lstClass.addListSelectionListener(new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (XmlPanel.this.lstClass.getSelectedIndex() == -1) { //No selection, disable fire button. XmlPanel.this.btnDelPro.setEnabled(false);
} else { //Selection, enable the fire button. XmlPanel.this.btnDelPro.setEnabled(true); } } } } ); JScrollPane sp1=new JScrollPane(this.lstClass); this.btnDelPro=new JButton("删除属性"); this.btnDelPro.setEnabled(false); this.btnDelPro.addActionListener(new DelPropertyListener()); JPanel p1=new JPanel(); p1.add(this.btnDelPro); propertyPane.add(sp1,BorderLayout.CENTER); propertyPane.add(p1,BorderLayout.SOUTH); /*************************************************************** */ elementPane=new JPanel(new BorderLayout()); elementPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("XML 元素属性"), BorderFactory.createEmptyBorder(5,5,5,5))); this.lmXml=new DefaultListModel(); this.lstXml=new JList(this.lmXml); this.lstXml.addListSelectionListener(new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (XmlPanel.this.lstXml.getSelectedIndex() == -1) { //No selection, disable fire button. XmlPanel.this.btnDelElement.setEnabled(false);
} else { //Selection, enable the fire button. XmlPanel.this.btnDelElement.setEnabled(true); } } } } ); JScrollPane sp2=new JScrollPane(this.lstXml); this.btnDelElement=new JButton("删除"); this.btnDelElement.setEnabled(false); this.btnDelElement.addActionListener(new DelElementListener()); this.txtProperty=new JTextField(15); this.btnAddElement=new JButton("添加"); this.btnAddElement.setEnabled(false); this.btnAddElement.addActionListener(new AddElement()); this.txtProperty.getDocument().addDocumentListener( new AddTextListener(this.btnAddElement)); JPanel p2=new JPanel(); p2.add(this.btnDelElement); p2.add(this.txtProperty); p2.add(this.btnAddElement); elementPane.add(sp2,BorderLayout.CENTER); elementPane.add(p2,BorderLayout.SOUTH); /*********************************************** */ xmlPane=new JPanel(new BorderLayout()); xmlPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("生成的 XML"), BorderFactory.createEmptyBorder(5,5,5,5))); this.xmlContent=new JTextArea(10,60); this.xmlContent.setEditable(false); this.lblRoot=new JLabel("根节点:"); this.lblElement=new JLabel("子节点名称:"); this.txtRoot=new JTextField("root",15); this.txtElement=new JTextField("item",15); this.btnGen=new JButton("生成XML"); DocumentListener dl=new AddTextListener(this.btnGen); this.txtRoot.getDocument().addDocumentListener(dl); this.txtElement.getDocument().addDocumentListener(dl); this.btnGen.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ String root=txtRoot.getText().trim(); String element=txtElement.getText().trim(); if(root.equals("")) root="root"; if(element.equals("")) element="item"; String[] rows=new String[lmClass.size()]; for(int i=0;i<lmClass.size();i++) rows[i]=(String)lmClass.getElementAt(i); String[] pros =new String[lmXml.size()]; for(int i=0;i<lmXml.size();i++) pros[i]=(String)lmXml.getElementAt(i); String s=Generator.generateXml(root,element,rows,pros); xmlContent.setText(s); } } ); JScrollPane sp3=new JScrollPane(this.xmlContent); JPanel p3=new JPanel(); p3.add(this.lblRoot); p3.add(this.txtRoot); p3.add(this.lblElement); p3.add(this.txtElement); p3.add(this.btnGen); xmlPane.add(sp3,BorderLayout.CENTER); xmlPane.add(p3,BorderLayout.SOUTH); midPane=new JPanel(new GridLayout(1,1)); midPane.add(propertyPane); midPane.add(elementPane); //this.makeSize(); this.add(classPane,BorderLayout.NORTH); this.add(midPane,BorderLayout.CENTER); this.add(xmlPane,BorderLayout.SOUTH); //this.add(new JLabel("Fuck"),BorderLayout.NORTH); } public XmlPanel(){ init(); } class AddElement implements ActionListener{ public void actionPerformed(ActionEvent e){ String name =txtProperty.getText().trim();
//User didn't type in a unique name... if (name.equals("") || lmXml.contains(name)) { Toolkit.getDefaultToolkit().beep(); txtProperty.requestFocusInWindow(); txtProperty.selectAll(); return; }
int index = lstXml.getSelectedIndex(); //get selected index if (index == -1) { //no selection, so insert at beginning index = 0; } else { //add after the selected item index++; }
lmXml.insertElementAt(name.trim(), index); //If we just wanted to add to the end, we'd do this: //listModel.addElement(employeeName.getText());
//Reset the text field. txtProperty.requestFocusInWindow(); txtProperty.setText("");
//Select the new item and make it visible. lstXml.setSelectedIndex(index); lstXml.ensureIndexIsVisible(index); } } class AddTextListener implements DocumentListener { private boolean alreadyEnabled = false; private JButton button;
public AddTextListener(JButton button) { this.button = button; }
//Required by DocumentListener. public void insertUpdate(DocumentEvent e) { enableButton(); }
//Required by DocumentListener. public void removeUpdate(DocumentEvent e) { handleEmptyTextField(e); }
//Required by DocumentListener. public void changedUpdate(DocumentEvent e) { if (!handleEmptyTextField(e)) { enableButton(); } }
private void enableButton() { if (!alreadyEnabled) { button.setEnabled(true); } }
private boolean handleEmptyTextField(DocumentEvent e) { if (e.getDocument().getLength() <= 0) { button.setEnabled(false); alreadyEnabled = false; return true; } return false; } } class DelPropertyListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if //there's a valid selection //so go ahead and remove whatever's selected. int[] index = lstClass.getSelectedIndices(); if(index.length==0) return; for(int i=index.length-1;i>=0;i--) lmClass.remove(index[i]);
int size = lmClass.getSize();
if (size == 0) { //Nobody's left, disable firing. btnDelPro.setEnabled(false);
} else { //Select an index. //removed item in last position int pos=index[0]-1; if(pos<0) pos=0; lstClass.setSelectedIndex(pos); lstClass.ensureIndexIsVisible(pos); } } } class DelElementListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if //there's a valid selection //so go ahead and remove whatever's selected. int[] index = lstXml.getSelectedIndices(); if(index.length==0) return; for(int i=index.length-1;i>=0;i--) lmXml.remove(index[i]);
int size = lmXml.getSize();
if (size == 0) { //Nobody's left, disable firing. btnDelElement.setEnabled(false);
} else { //Select an index. //removed item in last position int pos=index[0]-1; if(pos<0) pos=0; lstXml.setSelectedIndex(pos); lstXml.ensureIndexIsVisible(pos); } } } }
//Generator.java
package xmlgen.core;
import java.util.*; import java.lang.reflect.*; public class Generator{ public static List getProperties(Class c){ Method[] ms=c.getMethods(); List list=new ArrayList(); String mn=""; String pro=""; for(int i=0;i<ms.length;i++){ if(ms[i].getParameterTypes().length!=0) continue; mn=ms[i].getName(); if(mn.equals("getClass")) continue; if(mn.startsWith("get")&&mn.length()>3){ pro=mn.substring(3,4).toLowerCase(); if(mn.length()>4) pro+=mn.substring(4); list.add(pro); } } return list; } private static String crln="\r\n"; public static String generateXml(String root,String element,String[] rows,String[] properties){ // String pro=""; for(int i=0;i<properties.length;i++){ pro+=" "+properties[i]+"=\"\""; } String header="<"+element+" name=\""; StringBuffer sb=new StringBuffer(100); sb.append('<'); sb.append(root); sb.append(">"); sb.append(crln); for(int i=0;i<rows.length;i++){ sb.append('\t'); sb.append(header); sb.append(rows[i]); sb.append('\"'); sb.append(pro); sb.append(" />"); sb.append(crln); } sb.append("</"); sb.append(root); sb.append(">"); return sb.toString(); } }

|