1
我渲染了一個複選框節點樹。 渲染器使用(複選框+文件夾如圖標)和葉節點(僅複選框)呈現父節點。編輯器爲相應的渲染器,複選框節點樹
我已經呈現它,現在我想讓它可編輯。 (即)當我點擊它時,複選框必須選中並取消選中。
我試着寫一個編輯器。但我不清楚如何編寫它。請指導我如何做到這一點。
非常感謝提前。
我已經從Vector構建了樹。該向量稱爲NamedVector,它包含父節點對象。父節點對象保存葉節點。葉節點的類型是CheckBoxNode。
public class CheckBoxNodeRenderer implements TreeCellRenderer{
NonLeafRenderer nonLeafRenderer = new NonLeafRenderer();
protected JCheckBox check;
protected JLabel label;
public JPanel panel;
CheckBoxNode checkNode;
public JCheckBox getLeafRenderer()
{
return leafRenderer;
}
public CheckBoxNodeRenderer()
{
panel = new JPanel();
panel.setLayout(new BorderLayout());
check = new JCheckBox();
label = new JLabel();
Font fontValue;
fontValue = UIManager.getFont("Tree.font");
if (fontValue != null) {
leafRenderer.setFont(fontValue);
}
Boolean booleanValue = (Boolean) UIManager
.get("Tree.drawsFocusBorderAroundIcon");
leafRenderer.setFocusPainted((booleanValue != null)
&& (booleanValue.booleanValue()));
selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor");
selectionForeground = UIManager.getColor("Tree.selectionForeground");
selectionBackground = UIManager.getColor("Tree.selectionBackground");
textForeground = UIManager.getColor("Tree.textForeground");
textBackground = UIManager.getColor("Tree.textBackground");
}
///////////////////
/**
* Approach by returning a panel .
*/
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean isSelected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
String stringValue = tree.convertValueToText(value, isSelected,
expanded, leaf, row, hasFocus);
panel.setEnabled(true);
if(leaf){
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
checkNode = (CheckBoxNode)node.getUserObject();
check.setSelected(checkNode.isSelected());
label.setFont(tree.getFont());
label.setText(value.toString());
label.setIcon(null);
panel.removeAll();
panel.add(check,BorderLayout.WEST);
panel.add(label);
panel.setVisible(true);
}
}
else if(!leaf){
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
Object parent = (Object)node.getUserObject();
System.err.println(parent.toString());
NamedVector parentNode = (NamedVector) parent;
check.setSelected(parentNode.isSelected());
label.setFont(tree.getFont());
label.setText(parentNode.toString());
label.setIcon(UIManager.getIcon("Tree.openIcon"));
panel.removeAll();
panel.add(check,BorderLayout.WEST);
panel.add(label);
panel.setVisible(true);
}
}
return panel;
}
我試過了,並且再次得到相同的結果。沒有發生 。 – Achilles 2012-02-07 03:47:24
你有沒有試過擴展DefaultTreeCellRenderer?我通常這樣做,而不是實現TreeCellRenderer接口,給你很多免費的。我基本上做了一些與你所擁有的非常相似的東西,這對我來說很有用。子類與界面是唯一的區別。 – Michael 2012-02-07 03:53:22
但defaultTreeCellRenderer將父節點呈現爲一個圖標。我想要複選框和父節點的圖標。這就是我去自定義渲染器的原因。 – Achilles 2012-02-07 03:55:31