【问题标题】:Refresh JTree without collapsing刷新JTree而不崩溃
【发布时间】:2015-08-17 11:22:27
【问题描述】:

我有一棵以 JButton 作为节点的树。

我希望能够在两组值之间切换按钮名称及其调用的方法。

我认为如果每次单击按钮后树都会刷新,这会很好。

This method 似乎有效,但刷新时树会倒塌,我需要树保持打开状态。

我没有添加/删除节点,所以我在网上看到的许多其他方法都不适用。

public void valueChanged(TreeSelectionEvent e) 
{
    DefaultMutableTreeNode node = (DefaultMutableTreeNode)
            tree.getLastSelectedPathComponent();

    /* if nothing is selected */ 
    if (node == null) return;

    /* retrieve the node that was selected */ 
    Object obj = node.getUserObject();
    if (obj instanceof EmployeeButton)

        EmployeeButton eb = (EmployeeButton) obj;
        if (eb.getText().contains("Add Employee"));
        {
            eb.setText("Remove Employee");
            addEmp(eb.point);
        }
        if (eb.getText().contains("Remove Employee"));
        {
            eb.setText("Add Employee");
            delEmployee(eb.point);
        }
}; 

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    使用Jakub Zaverka 对一个有点相似的问题 (Compound JTree Node allowing events to pass through to objects underneath) 的出色回答,您可以执行以下操作:

    // Class RefreshTree.java:
    
    import javax.swing.*;
    import javax.swing.tree.*;
    
    public class RefreshTree {
        public static final String ADD_EMPLOYEE = "Add Employee";
        public static final String REMOVE_EMPLOYEE = "Remove Employee";
    
        public static void main(final String[] arguments) {
            new RefreshTree().launchGui();
        }
    
        private void launchGui() {
            final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("root");
            rootNode.add(new DefaultMutableTreeNode(ADD_EMPLOYEE));
            rootNode.add(new DefaultMutableTreeNode(ADD_EMPLOYEE));
            rootNode.add(new DefaultMutableTreeNode(ADD_EMPLOYEE));
    
            final JTree tree = new JTree(rootNode);
            tree.setEditable(true);
            tree.setCellRenderer(new ButtonCellRenderer());
            tree.setCellEditor(new ButtonCellEditor());
    
            final JFrame frame = new JFrame("Refresh JTree with JButton");
            frame.getContentPane().add(new JScrollPane(tree));
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setBounds(400, 200, 600, 600);
            frame.setVisible(true);
        }
    }
    
    
    // Class ButtonCellEditor.java:
    
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    
    public class ButtonCellEditor extends AbstractCellEditor implements TreeCellEditor {
        private JButton button;
    
        public ButtonCellEditor() {
            button = new JButton(RefreshTree.ADD_EMPLOYEE);
            button.addActionListener(actionEvent -> {
                final boolean add = RefreshTree.ADD_EMPLOYEE.equals(button.getText());
                if (add)
                    System.out.println("Call addEmp(eb.point)");
                else
                    System.out.println("Call delEmployee(eb.point)");
                button.setText(add ? RefreshTree.REMOVE_EMPLOYEE : RefreshTree.ADD_EMPLOYEE);
                stopCellEditing();
            });
        }
    
        @Override
        public Object getCellEditorValue() {
            return button.getText();
        }
    
        @Override
        public Component getTreeCellEditorComponent(final JTree tree,
                                                    final Object value,
                                                    final boolean isSelected,
                                                    final boolean expanded,
                                                    final boolean leaf,
                                                    final int row) {
            button.setText(value.toString());
            return button;
        }
    }
    
    
    // Class ButtonCellRenderer.java:
    
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    
    public class ButtonCellRenderer extends JButton implements TreeCellRenderer {
        @Override
        public Component getTreeCellRendererComponent(final JTree tree,
                                                      final Object value,
                                                      final boolean selected,
                                                      final boolean expanded,
                                                      final boolean leaf,
                                                      final int row,
                                                      final boolean hasFocus) {
            setText(value.toString());
            return this;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 2022-07-09
      • 2014-05-06
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多