我有一个JTree cho有这样的渲染器:
public class BrowserNodeRenderer extends DefaultTreeCellRenderer {
private JLabel label;
private JPanel panel;
private JLabel iconLabel;
private JTextField textField;
public BrowserNodeRenderer() {
this.panel = new JPanel();
final BorderLayout layout = new BorderLayout();
this.panel.setLayout(layout);
this.iconLabel = new JLabel();
this.label = new JLabel();
this.label.setOpaque(true);
//Unbold text
final Font f = this.label.getFont();
this.label.setFont(f.deriveFont(f.getStyle() & ~Font.BOLD));
this.panel.add(this.iconLabel);
this.panel.add(this.label, BorderLayout.CENTER);
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
//Editing label and icon depending on rules
//...
return panel;
}
}
当我右键单击某个节点时,会显示一个JPopup菜单,其中包含重命名当前节点的选项。
但我真的不知道如何告诉节点显示文本字段来代替要编辑的标签。
答案 0 :(得分:5)
您可以将TreeCellEditor
用于JTree
的自定义编辑器。以下是编辑节点文本的简单示例:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreePath;
public class TestFrame extends JFrame {
public static void main(String... s) {
new TestFrame();
}
private JTree t;
public TestFrame() {
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void init() {
t = new JTree();
t.setEditable(true);
t.setCellEditor(getEditor());
JPopupMenu menu = new JPopupMenu();
JMenuItem item = new JMenuItem("edit");
item.addActionListener(getEditActionListener());
menu.add(item);
t.setComponentPopupMenu(menu);
t.addMouseListener(getMouseListener());
add(new JScrollPane(t));
}
private TreeCellEditor getEditor() {
return new DefaultTreeCellEditor(t, (DefaultTreeCellRenderer) t.getCellRenderer()){
@Override
public Component getTreeCellEditorComponent(JTree tree,
Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
System.out.println("editing ");
return super.getTreeCellEditorComponent(tree, value, isSelected, expanded,leaf, row);
}
};
}
private MouseListener getMouseListener() {
return new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON3){
int rowForLocation = t.getRowForLocation(e.getPoint().x, e.getPoint().y);
if(rowForLocation != -1){
t.setSelectionRow(rowForLocation);
}
}
}
};
}
private ActionListener getEditActionListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TreePath selectionPath = t.getSelectionPath();
t.startEditingAtPath(selectionPath);
}
};
}
}