2015-06-03 81 views
1

我有一个树与JButton作为节点。刷新JTree没有崩溃

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

我认为这将工作正常,如果每个按钮点击后树会刷新。

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); 
     } 
}; 

回答

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; 
    } 
} 
+0

感谢您的出色答卷 – Dawson