删除 JTree 中的节点
Strikethrough a node in a JTree
在我的项目中,我有一个带有自定义节点的 Jtree(它扩展了 DefaultMutableTreeNode)。每个节点都与一个布尔值相关联。当布尔值为 False 时,我想删除节点的文本。例如:
- 节点1
- node1.1
node1.2
- 节点2
- node2.1
- ...
我试图创建一个新的字体,但我没有找到任何属性来删除文本,我只能设法将我的自定义字体添加到整个树中,而不是逐个节点添加。
我认为我应该使用 TreeRenderer,但我找不到任何方法来帮助我点击节点。
有人知道我能做到吗?
查看下面的示例。为了简单起见,我只是在选定的节点上划线。当然,您需要对值使用自己的检查。
package snippet;
import java.awt.Component;
import java.awt.Font;
import java.awt.font.TextAttribute;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultTreeCellRenderer;
public class JTreeTest extends JFrame {
private final class StrikeoutCellRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
@Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
Component c = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
Font font = c.getFont();
Map attributes = font.getAttributes();
if(sel)
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
else
attributes.remove(TextAttribute.STRIKETHROUGH);
Font newFont = new Font(attributes);
c.setFont(newFont);
return c;
}
}
private static final long serialVersionUID = 1L;
public JTreeTest() {
super(JTreeTest.class.getName());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
}
private void initComponents() {
JTree tree = new JTree();
tree.setCellRenderer(new StrikeoutCellRenderer());
add(tree);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
JTreeTest t = new JTreeTest();
t.setVisible(true);
}
});
}
}
请注意,即使节点不需要删除线,您也需要重新设置属性,因为单个组件用于绘制所有节点。
最简单的方法是定义渲染器(扩展 DefaultTreeCellRenderer
)并调用 setText()
传递 html 字符串,如“<html><u>node1.2</u></html>
”作为删除线的值.
在我的项目中,我有一个带有自定义节点的 Jtree(它扩展了 DefaultMutableTreeNode)。每个节点都与一个布尔值相关联。当布尔值为 False 时,我想删除节点的文本。例如:
- 节点1
- node1.1
node1.2
- 节点2
- node2.1
- ...
我试图创建一个新的字体,但我没有找到任何属性来删除文本,我只能设法将我的自定义字体添加到整个树中,而不是逐个节点添加。
我认为我应该使用 TreeRenderer,但我找不到任何方法来帮助我点击节点。
有人知道我能做到吗?
查看下面的示例。为了简单起见,我只是在选定的节点上划线。当然,您需要对值使用自己的检查。
package snippet;
import java.awt.Component;
import java.awt.Font;
import java.awt.font.TextAttribute;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultTreeCellRenderer;
public class JTreeTest extends JFrame {
private final class StrikeoutCellRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
@Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
Component c = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
Font font = c.getFont();
Map attributes = font.getAttributes();
if(sel)
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
else
attributes.remove(TextAttribute.STRIKETHROUGH);
Font newFont = new Font(attributes);
c.setFont(newFont);
return c;
}
}
private static final long serialVersionUID = 1L;
public JTreeTest() {
super(JTreeTest.class.getName());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
}
private void initComponents() {
JTree tree = new JTree();
tree.setCellRenderer(new StrikeoutCellRenderer());
add(tree);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
JTreeTest t = new JTreeTest();
t.setVisible(true);
}
});
}
}
请注意,即使节点不需要删除线,您也需要重新设置属性,因为单个组件用于绘制所有节点。
最简单的方法是定义渲染器(扩展 DefaultTreeCellRenderer
)并调用 setText()
传递 html 字符串,如“<html><u>node1.2</u></html>
”作为删除线的值.