저는 JTree
과 JTextField
입니다. 트리에서 노드를 선택하면 텍스트 필드에 노드 값이 표시됩니다. 그런 다음 텍스트를 편집하고 저장하여 선택한 노드의 값을 변경할 수 있습니다. 나는 DefaultTreeModel
의 nodeChanged
메서드를 사용하여 트리를 업데이트합니다.'nodeChanged'를 사용하여 트리 노드를 업데이트하는 것이 맞습니까
트리 모델에 노드 업데이트를 알리는 적절한 방법입니까? 내게는 명백하게 나무의 모델에 액세스하여 무언가가 일어 났음을 말하기 때문에 추한 것처럼 보입니다.
여기 DefaultTreeModel을하고 DefaultMutableTreeNode에 대한 JavaDoc을 코드 주위에 파고에서 일부 코드
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class TextPaneTest extends JFrame {
private JTextField textBox = null;
private JTree tree = null;
private JButton button = null;
public static void main(String args[]) {
new TextPaneTest();
}
public TextPaneTest() {
// Main panel
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
// Panel holding tree
JPanel treePanel = new JPanel();
treePanel.setLayout(new BorderLayout());
// Panel holding text field and button
JPanel editPanel = new JPanel();
editPanel.setLayout(new BorderLayout());
// My textbox
textBox = new JTextField();
// button
button = new JButton();
button.setText("Save changes");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
String text = textBox.getText();
node.setUserObject(text);
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
model.nodeChanged(node);
}
});
// My Tree
DefaultMutableTreeNode top = new DefaultMutableTreeNode("Root");
tree = new JTree(top);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
textBox.setText(node.getUserObject().toString());
}
});
JScrollPane scrollPane = new JScrollPane(tree);
scrollPane.setHorizontalScrollBarPolicy(
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// Add tree
treePanel.add(scrollPane);
panel.add(treePanel, BorderLayout.CENTER);
// Add box and button to edit panel
editPanel.add(textBox, BorderLayout.CENTER);
editPanel.add(button, BorderLayout.SOUTH);
// Add edit panel
panel.add(editPanel, BorderLayout.SOUTH);
// Add everything to the frame
this.add(panel);
this.setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
를 통해 독점적으로 노드를 업데이트 한 경우가 약간 덜 추한을 보일 수 있습니다 't (특정'TreeCellRenderer'를 가지고 있는데 차이가 나는지 모르겠다.). 어쨌든, +1! :) – Matthieu