標準のSwingJTreeを変更して、チェックボックスのあるノードとないノードを混在させようとしています。これは例です:
チェックボックスの1つ(この例では「User01」ノード)をオン/オフにしようとすると、ツリーはノードを失います。
私のコードはこの例を応用したものです:http://forums.sun.com/thread.jspa ?threadID = 5321084&start=13 。
次のように、DefaultMutableTreeNodeにJCheckBoxを埋め込む代わりに:
new DefaultMutableTreeNode(new CheckBoxNode("Accessibility", true));
DefaultMutableTreeNodeから派生したモデルノードを作成する方が理にかなっていると思いました。これをJTreeNodeと呼びます。このクラスは、DefaultMutableTreeNodeのUserObjectをJCheckBoxに自動的に設定します。クラスのShowCheckBoxプロパティは、TreeCellRendererによって使用され、JCheckBoxまたはDefaultTreeCellRendererのどちらが使用されているかを判別します。JTreeNodeは次のように使用されます。
JTreeNode user01 = new JTreeNode("User 01");
user01.setShowCheckBox(true);
user01.setSelected(true);
問題は、TreeCellEditorを実装するクラス、特にgetCellEditorValue()またはgetTreeCellEditorComponent()メソッドにあると思います。この問題は、getCellEditorValue()が、より単純なモデルインスタンスではなく、DefaultMutableTreeNodeの派生物を返すことに関係していると思われます。
public Object getCellEditorValue() {
JCheckBox checkBox = renderer.getCheckBoxRenderer();
JTreeNode node = new JTreeNode(checkBox.getText());
node.setShowCheckBox(true);
node.setSelected(checkBox.isSelected());
return node;
}
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
Component editor = renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true);
// editor always selected / focused
ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
};
if (editor instanceof JCheckBox) {
((JCheckBox) editor).addItemListener(itemListener);
}
return editor;
}
TreeCellRenderのgetTreeCellRendererComponent()メソッドは次のとおりです。
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
Component component;
//if object being passed for rendering is a JTreeNode that should show a JCheckBox, attempt to render it so
if (((JTreeNode) value).getShowCheckBox()) {
String stringValue = tree.convertValueToText(value, selected, expanded, leaf, row, false);
//set default JCheckBox rendering
checkBoxRenderer.setText(stringValue);
checkBoxRenderer.setSelected(false); //not checked
checkBoxRenderer.setEnabled(tree.isEnabled());
if (selected) {
//removed colorization
//checkBoxRenderer.setForeground(selectionForeground);
//checkBoxRenderer.setBackground(selectionBackground);
}
else {
checkBoxRenderer.setForeground(textForeground);
checkBoxRenderer.setBackground(textBackground);
}
//DefaultMutableTreeNode
if ((value != null) && (value instanceof JTreeNode)) {
//userObject should be a JTreeNode instance
//DefaultMutableTreeNode
//Object userObject = ((JTreeNode) value).getUserObject();
//if it is
//if (userObject instanceof JTreeNode) {
//cast as a JTreeNode
//JTreeNode node = (JTreeNode) userObject;
JTreeNode node = (JTreeNode) value;
//set JCheckBox settings to match JTreeNode's settings
checkBoxRenderer.setText(node.getText());
checkBoxRenderer.setSelected(node.isSelected());
//}
}
component = checkBoxRenderer;
}
//if not, render the default
else {
component = defaultRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
}
return component;
}
どんな考えでも大歓迎です。