【问题标题】:Edit JTree's node with a textfield使用文本字段编辑 JTree 的节点
【发布时间】:2015-03-17 12:51:54
【问题描述】:

我有一个 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 菜单,其中包含重命名当前节点的选项。

但我真的不知道如何告诉节点显示一个文本字段来代替要编辑的标签。

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    您可以使用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);
                }
            };
        }
    
    }
    

    【讨论】:

    • 谢谢。我做了类似的事情,但是当我左键单击一个节点时,它变成了可编辑的。不仅通过按右键单击的菜单。编辑:我在stackoverflow.com/a/21138857/1479829 找到了方法
    猜你喜欢
    • 2017-12-16
    • 2012-05-13
    • 1970-01-01
    • 2012-10-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多