我有一個JTree,其中樹的每個節點代表一些用戶數據。數據是可編輯的並存儲在文件/數據庫中。有一堆JTextField可以讓你編輯/更新節點的用戶數據。當JTextField失去焦點時,保存數據事件。除非在JTree中更改節點的選擇,否則這可以正常工作。因爲JTree事件的valueChanged發生在JTextField的focusLost之前。JTree valueChanged事件在單擊節點時調用另一個組件的focusLost之前被調用
這裏是一個SSCCE:http://pastebin.com/wH1Veqdc
public class JTreeFocusTest extends JFrame{
private static final long serialVersionUID = 1L;
public JTreeFocusTest() {
super("JTree Focus Test");
JPanel panel = new JPanel(true);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
MyTree tree = new MyTree();
panel.add(tree);
panel.add(Box.createVerticalStrut(20));
panel.add(new MyTextField(tree));
panel.add(Box.createVerticalStrut(20));
panel.add(new JTextField(30));
getContentPane().add(panel);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
}
public static void main(String[] args){
new JTreeFocusTest();
}
}
class MyTree extends JTree{
private static final long serialVersionUID = 1L;
public MyTree() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode(new MyNode("Root", "Root"));
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(new MyNode("Child 1", "DOC122122"));
root.add(child1);
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode(new MyNode("Child 2", "DOC134342"));
root.add(child2);
DefaultTreeModel model = new DefaultTreeModel(root, true);
setModel(model);
getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
setSelectionPath(getPathForRow(0));
}
}
class MyTextField extends JTextField implements FocusListener, TreeSelectionListener{
private static final long serialVersionUID = 1L;
private MyTree tree;
public MyTextField(MyTree tree) {
this.tree = tree;
setText("Some");
addFocusListener(this);
this.tree.addTreeSelectionListener(this);
Dimension dim = new Dimension(200, 20);
setPreferredSize(dim);
setMaximumSize(dim);
setMinimumSize(dim);
}
@Override
public void focusGained(FocusEvent e) {System.out.println("TextField gained focus");}
@Override
public void focusLost(FocusEvent e) {
getSelectedNodeUserObj().setValue(getText());
}
@Override
public void valueChanged(TreeSelectionEvent e) {
setText(getSelectedNodeUserObj().getValue());
}
private MyNode getSelectedNodeUserObj(){
return ((MyNode)((DefaultMutableTreeNode)this.tree.getSelectionPath().getLastPathComponent()).getUserObject());
}
}
class MyNode{
private String label = "";
private String value = "";
public MyNode(String label, String value) {
this.label = label;
this.value = value;
}
public void setValue(String value){
this.value = value;
}
public String getValue(){
return value;
}
public String toString(){
return label;
}
}
在這個例子中我只是一個領域,但在實際應用中,我有幾個字段代表用戶數據。另外JTextField只是一個例子,輸入字段可以是JComboBox或JSpinner。
如何保存此用戶數據?我會很感激任何幫助/指針。
謝謝!
在此處發佈代碼,而不是在pastebin上。 – camickr
它長時間粘貼在這裏。我認爲這樣做會很不方便,因爲有時會讓問題難以閱讀。 – Mo3z