2013-10-31 50 views
0

我尽量让JTree的定制TreeRendererSwing JTree如何自定义渲染从自定义编辑器获取价值?

,并用自定义编辑器

public class TextCellEdit extends AbstractCellEditor implements TreeCellEditor {  

至极getTreeCellEditorComponent回报面板getTreeCellEditorComponent但JComboBox中至极项目从数据库填充。 渲染和编辑器很好,我可以点击字段和comboBox显示来自数据库的值。

public Component getTreeCellEditorComponent(JTree tree, Object value, 
     boolean isSelected, boolean expanded, boolean leaf, int row) { 
    if (value != null && value instanceof DefaultMutableTreeNode) { 
     Object userObject = ((DefaultMutableTreeNode) value).getUserObject(); 
     if (userObject instanceof FieldObj) { 
      FieldObj my = (FieldObj) userObject; 
      box.removeAllItems(); 
      label.setText(my.FieldName); 
      populatebox(my.FieldName); 
      box.addItem(my.valueList); 
      panel.add(label); 
      panel.add(box); 
     } else { 
      box.addItem("Uknown object type"); 
     } 
     return panel; 
    } 
} 
public Object getCellEditorValue() { 
    System.out.println("getCellEditoValue returns :" + box.getSelectedItem()); 
    return box.getSelectedItem(); 
} 

但它不保存在渲染textarea的 我的意思是渲染我有面板: 的JLabel(字段名) 的JTextArea(fieldValue方法)

当我的JTextArea点击我有我的编辑至极有 的JLabel(字段名) 的JComboBox(FieldValues至极我已经从数据库填充)

,但是当我选择什么形式编辑的ComboBox它不保存在渲染文本区域 所以,问题是如何事情应该工作? 组件如何从编辑组件获取值?

回答

1

当您实施TreeCellEditor您必须覆盖public Object getCellEditorValue()方法。该方法在您取消/退出编辑时调用。在这种方法中,您可以将您的新值保存到您在TreeNode中存储的对象。然后你的渲染器得到编辑对象与getTreeCellRendererComponent方法中的新值。

编辑:你们的编辑是这样的:当我编辑器组件是变化

public class TextCellEdit extends AbstractCellEditor implements TreeCellEditor { 

private JComboBox<Object> box; 
private JLabel label; 
private JPanel panel; 
private FieldObj my; 

public Component getTreeCellEditorComponent(JTree tree, Object value, 
     boolean isSelected, boolean expanded, boolean leaf, int row) { 

    if (value != null && value instanceof DefaultMutableTreeNode) { 
     Object userObject = ((DefaultMutableTreeNode) value) 
       .getUserObject(); 
     if (userObject instanceof FieldObj) { 
      my = (FieldObj) userObject; 
      box.removeAllItems(); 
      label.setText(my.FieldName); 
      populatebox(my.FieldName); 
      box.addItem(my.valueList); 
      panel.add(label); 
      panel.add(box); 
     } else { 
      box.addItem("Uknown object type"); 
     } 
     return panel; 
    } 
} 

public Object getCellEditorValue() { 
    System.out.println("getCellEditoValue returns :" + box.getSelectedItem()); 
    my.FieldName = box.getSelectedItem(); 
    return box.getSelectedItem(); 
} 
} 
+0

这是不完全正确getCellEditorValue()被invoken,但我找不到在哪里渲染使用它。 (我已经实现了这个方法,在我看来,它需要验证或其他需要修改值的东西) 似乎Render使用了一些Listener,但现在我找不到它了。 – user1722669

+0

Renderer不使用它。它只会改变你的对象。渲染器再次读取对象并捕捉更改。编辑:'getTreeCellRendererComponent'中的渲染器总是得到更改的对象并显示它。 – alex2410

+0

感谢您的帮助。 我编辑我的问题(添加getCellEditorValue实现)你可以告诉它有什么不对吗 它尝试返回box.getSelectedItem()。toString()为了大小写。 首先,我认为Render获得价值,但可以设置它,因为我返回面板,我尝试从Render返回TextArea,结果相同。 另外我找不到getCellEditorValue()的一个很好的解释。 – user1722669