Java 我需要将我的DOM与;“持久层”;
我已经创建了一个应用程序,它引用了一个用户列表,从XML文件分配到JTree组件,然后可以相应地查看和编辑该组件。到目前为止,我的代码是:Java 我需要将我的DOM与;“持久层”;,java,persistence,layer,jtree,Java,Persistence,Layer,Jtree,我已经创建了一个应用程序,它引用了一个用户列表,从XML文件分配到JTree组件,然后可以相应地查看和编辑该组件。到目前为止,我的代码是: public class DomainModel extends JFrame { private JTree tree; private String fileSource = "users.xml"; private NodeList listOfUsers; private String objID; pri
public class DomainModel extends JFrame {
private JTree tree;
private String fileSource = "users.xml";
private NodeList listOfUsers;
private String objID;
private JTextField textName;
private JTextField textAge;
private JTextField textDOB;
private JButton editBtn;
private JTextField textEditName;
private JTextField textEditAge;
private JTextField textEditDOB;
private JButton saveBtn;
private JButton cancelBtn;
public DomainModel() {
createGUI();
}
public void createGUI() {
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridLayout(1, 2));
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new GridLayout(1, 1));
leftPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Domain Model"),
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
createTree();
tree.setLayout(new GridLayout(1, 1));
tree.setBorder(new EmptyBorder(10, 10, 10, 10));
tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
nodeChange(e);
}
});
JPanel rightPanel = new JPanel();
rightPanel.setLayout(new GridLayout(2, 1));
JPanel detailsPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
detailsPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Node Details"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));
JLabel labelName = new JLabel("Name");
JLabel labelAge = new JLabel("Age");
JLabel labelDOB = new JLabel("DOB");
textName = new JTextField(15);
textAge = new JTextField(15);
textDOB = new JTextField(15);
editBtn = new JButton("Edit");
editBtn.addActionListener(new ButtonListener());
detailsPanel.add(labelName);
detailsPanel.add(textName);
detailsPanel.add(labelAge);
detailsPanel.add(textAge);
detailsPanel.add(labelDOB);
detailsPanel.add(textDOB);
detailsPanel.add(editBtn);
JPanel editPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
editPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Edit Node"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));
JLabel labelEditName = new JLabel("Name");
JLabel labelEditAge = new JLabel("Age");
JLabel labelEditDOB = new JLabel("DOB");
textEditName = new JTextField(15);
textEditAge = new JTextField(15);
textEditDOB = new JTextField(15);
saveBtn = new JButton("Save");
saveBtn.addActionListener(new ButtonListener());
cancelBtn = new JButton("Cancel");
cancelBtn.addActionListener(new ButtonListener());
editPanel.add(labelEditName);
editPanel.add(textEditName);
editPanel.add(labelEditAge);
editPanel.add(textEditAge);
editPanel.add(labelEditDOB);
editPanel.add(textEditDOB);
editPanel.add(saveBtn);
editPanel.add(cancelBtn);
leftPanel.add(new JScrollPane(tree));
rightPanel.add(detailsPanel);
rightPanel.add(editPanel);
mainPanel.add(leftPanel);
mainPanel.add(rightPanel);
mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
add(mainPanel);
nullDetails();
nullEdit();
setTitle("Domain Model Example");
setSize(525, 350);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
}
public void createTree(){
DefaultMutableTreeNode root = new DefaultMutableTreeNode("users");
try {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File(fileSource));
listOfUsers = doc.getElementsByTagName("user");
// for each user in the node list, add it to the JTree
for (int i = 0; i < listOfUsers.getLength(); i++) {
Element el = (Element) listOfUsers.item(i);
String id = el.getAttribute("id");
File file = new File(id);
DefaultMutableTreeNode node = new DefaultMutableTreeNode(file);
root.add(node);
}
tree = new JTree(root);
} catch (Exception e) {
e.printStackTrace();
}
}
public void nodeChange(TreeSelectionEvent e) {
nullDetails();
nullEdit();
objID = e.getPath().getLastPathComponent().toString();
// for each user in the node list, find an ID match
for (int i = 0; i < listOfUsers.getLength(); i++) {
Element el = (Element) listOfUsers.item(i);
String strID = el.getAttribute("id");
// if an ID match has been found, display it's details
if (objID.equals(strID)) {
String strName = el.getElementsByTagName("name").item(0).getTextContent();
String strAge= el.getElementsByTagName("age").item(0).getTextContent();
String strDOB = el.getElementsByTagName("dob").item(0).getTextContent();
textName.setText(strName);
textAge.setText(strAge);
textDOB.setText(strDOB);
editBtn.setEnabled(true);
break;
}
}
}
public void nullDetails() {
textName.setText(null);
textAge.setText(null);
textDOB.setText(null);
textName.setEnabled(false);
textAge.setEnabled(false);
textDOB.setEnabled(false);
editBtn.setEnabled(false);
}
public void nullEdit() {
textEditName.setText(null);
textEditAge.setText(null);
textEditDOB.setText(null);
textEditName.setEnabled(false);
textEditAge.setEnabled(false);
textEditDOB.setEnabled(false);
saveBtn.setEnabled(false);
cancelBtn.setEnabled(false);
}
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent a) {
JButton b = (JButton) a.getSource();
String pressedBtn = b.getText();
// if the Edit button has been clicked
if (pressedBtn.equals("Edit")) {
textEditName.setText(textName.getText());
textEditAge.setText(textAge.getText());
textEditDOB.setText(textDOB.getText());
textEditName.setEnabled(true);
textEditAge.setEnabled(true);
textEditDOB.setEnabled(true);
saveBtn.setEnabled(true);
cancelBtn.setEnabled(true);
} else if (pressedBtn.equals("Save")) { // if the Save button has been clicked
int reply = JOptionPane.showConfirmDialog(null, "Are you sure you want to save?", "Save", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION) {
updateXML();
}
} else { // else the Cancel button has been clicked
nullEdit();
}
}
}
public void updateXML(){
// for each user in the node list, find an ID match
for (int i = 0; i < listOfUsers.getLength(); i++) {
Element el = (Element) listOfUsers.item(i);
String strId = el.getAttribute("id");
// if an ID match has been found, update the component's details
if (objID.equals(strId)) {
try {
String strName = textEditName.getText();
String strAge = textEditAge.getText();
String strDOB = textEditDOB.getText();
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File(fileSource));
doc.getElementsByTagName("name").item(i).setTextContent(strName);
doc.getElementsByTagName("age").item(i).setTextContent(strAge);
doc.getElementsByTagName("dob").item(i).setTextContent(strDOB);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(doc);
StreamResult streamResult = new StreamResult(new File(fileSource));
transformer.transform(domSource, streamResult);
el.getElementsByTagName("name").item(i).setTextContent(strName);
el.getElementsByTagName("age").item(i).setTextContent(strAge);
el.getElementsByTagName("dob").item(i).setTextContent(strDOB);
textName.setText(strName);
textAge.setText(strAge);
textDOB.setText(strDOB);
editBtn.setEnabled(true);
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
DomainModel dm = new DomainModel();
dm.setVisible(true);
}
});
}
}
公共类DomainModel扩展了JFrame{
私有JTree树;
私有字符串fileSource=“users.xml”;
私有节点列表用户;
私有字符串对象;
私有JTextField textName;
私有JTextField textAge;
私有JTextField textDOB;
私有JButton editBtn;
私有JTextField textEditName;
私有JTextField文本编辑;
私有JTextField textEditDOB;
私有JButton saveBtn;
私有JButton取消btn;
公共域模型(){
createGUI();
}
public void createGUI(){
JPanel mainPanel=新的JPanel();
设置布局(新的网格布局(1,2));
JPanel leftPanel=新的JPanel();
setLayout(新的GridLayout(1,1));
leftPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(“域模型”),
createEmptyByOrder(10,10,10,10));
createTree();
setLayout(新的GridLayout(1,1));
tree.setboorder(新的EmptyBorder(10,10,10,10));
tree.getSelectionModel().addTreeSelectionListener(新建TreeSelectionListener()){
公共作废值已更改(TreeSelection事件e){
nodeChange(e);
}
});
JPanel rightPanel=新的JPanel();
setLayout(新的GridLayout(2,1));
JPanel detailsPanel=新的JPanel(新的FlowLayout(FlowLayout.RIGHT));
detailsPanel.setBorder(BorderFactory.CreateCompundBorder(
BorderFactory.createTitledBorder(“节点详细信息”),
createEmptyByOrder(5,5,5,5));
JLabel labelName=新的JLabel(“名称”);
JLabel标签=新JLabel(“年龄”);
JLabel labelDOB=新JLabel(“DOB”);
textName=新的JTextField(15);
textAge=新的JTextField(15);
textDOB=新的JTextField(15);
editBtn=新的JButton(“编辑”);
editBtn.addActionListener(新按钮Listener());
detailsPanel.add(标签名称);
detailsPanel.add(文本名称);
详细信息添加(标签);
detailsPanel.add(文本页);
详细信息spanel.add(labelDOB);
详细信息spanel.add(textDOB);
detailsPanel.add(editBtn);
JPanel editPanel=newjpanel(newflowlayout(FlowLayout.RIGHT));
editPanel.setBorder(BorderFactory.createCompoundBorder(
CreateTTitleBorder(“编辑节点”),
createEmptyByOrder(5,5,5,5));
JLabel labelEditName=新的JLabel(“名称”);
JLabel标签编辑=新JLabel(“年龄”);
JLabel labelEditDOB=新JLabel(“DOB”);
textEditName=新的JTextField(15);
textEditAge=新的JTextField(15);
textEditDOB=新的JTextField(15);
saveBtn=新的JButton(“Save”);
saveBtn.addActionListener(新按钮Listener());
cancelBtn=新按钮(“取消”);
cancelBtn.addActionListener(新按钮Listener());
editPanel.add(labelEditName);
editPanel.add(textEditName);
editPanel.add(标签编辑);
editPanel.add(文本编辑);
editPanel.add(labelEditDOB);
editPanel.add(textEditDOB);
editPanel.add(saveBtn);
editPanel.add(cancelBtn);
添加(新的JScrollPane(树));
右面板。添加(detailsPanel);
添加(编辑面板);
mainPanel.add(左面板);
主面板。添加(右面板);
主面板设置命令(新的清空命令(10,10,10,10));
添加(主面板);
空细节();
空编辑();
setTitle(“域模型示例”);
设置大小(525350);
setLocationRelativeTo(空);
setDefaultCloseOperation(关闭时退出);
可设置大小(假);
}
公共void createTree(){
DefaultMutableTreeNode根=新的DefaultMutableTreeNode(“用户”);
试一试{
DocumentBuilderFactory docBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();
documentdoc=docBuilder.parse(新文件(fileSource));
ListoUsers=doc.getElementsByTagName(“用户”);
//对于节点列表中的每个用户,将其添加到JTree
对于(int i=0;iinterface DataStore { // model
List<User> getUsers();
void saveNewUser(User user);
}
class XmlDataStoreImpl implements DataStore { ... }
interface Ui { // view
void showUsers(List<User> users);
User getUserDataFromControls();
}
class DomainModel extends JFrame implements Ui { // view
static void main(String[] args) {
DataStore dataStore = new XmlDataStoreImpl("users.xml");
AppController app = new AppController(dataStore, this);
app.loadUsers();
}
void init() {
createControls(); // create empty JTree object and other controlls
}
}
class AppController { // controller
DataStore dataStore;
Ui ui;
public AppController(DataStore ds, Ui ui) {
...
ui.init();
}
void loadUsers() {
ui.showUsers(dataStore.getUsers()); // this line is your "createTree" but independent on implementations of model and view
}
void saveButtonClickedHandler() {
User user = ui.getUserDataFromControls();
dataStore.saveNewUser(user);
}
}