java - 为什么添加到 DefaultTreeCellRenderer 的 JButton 不显示?
问题描述
我写了一个 DefaultTreeCellRenderer 的子类,在方法内部getTreeCellRendererComponent
,我向 Object 添加了一个 JButton DefaultTreeCellRenderer
,我希望看到 JTree 的每个节点都有一个呈现的 JButton。但是JButton不显示,请看代码和截图。提前致谢!
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
public class TreeDemo{
TreeDemo(){
JFrame jFrame = new JFrame("TreeDemo");
DefaultMutableTreeNode rootNode = initNodes();
JTree jTree = new JTree(rootNode);
jTree.setCellRenderer(new CustomRenderer());
jFrame.getContentPane().add(jTree);
jFrame.setMinimumSize(new Dimension(400, 300));
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
DefaultMutableTreeNode initNodes(){
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
DefaultMutableTreeNode sub1 = new DefaultMutableTreeNode("sub1");
DefaultMutableTreeNode sub2 = new DefaultMutableTreeNode("sub1");
DefaultMutableTreeNode sub1_1 = new DefaultMutableTreeNode("sub1_1");
DefaultMutableTreeNode sub1_2 = new DefaultMutableTreeNode("sub1_2");
DefaultMutableTreeNode sub2_1 = new DefaultMutableTreeNode("sub2_1");
DefaultMutableTreeNode sub2_2 = new DefaultMutableTreeNode("sub2_2");
root.add(sub1);
root.add(sub2);
sub1.add(sub1_1);
sub1.add(sub1_2);
sub2.add(sub2_1);
sub2.add(sub2_2);
return root;
}
class CustomRenderer extends DefaultTreeCellRenderer{
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
JButton button = new JButton("Button");
setLayout(new BorderLayout());
add(button, BorderLayout.LINE_END);
setText("Node");
return this;
}
}
public static void main(String[] args) {
new TreeDemo();
}
}
解决方案
事件虽然JLabel
extends java.awt.Container
,但我认为您不能像JPanel
.
树单元渲染器必须实现接口javax.swing.tree.TreeCellRenderer
。它不需要扩展DefaultTreeCellRenderer
。另请注意,JTree
将使用相同的渲染器实例来渲染所有树节点。
下面的代码是您的代码,但使用了不同的树单元格渲染器。它创建一个单一JButton
的按钮,并为每个树节点显示该按钮。
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
import java.awt.Component;
import java.awt.Dimension;
public class TreeDemo{
TreeDemo(){
JFrame jFrame = new JFrame("TreeDemo");
DefaultMutableTreeNode rootNode = initNodes();
JTree jTree = new JTree(rootNode);
jTree.setCellRenderer(new ButtonRenderer());
jFrame.getContentPane().add(jTree);
jFrame.setMinimumSize(new Dimension(400, 300));
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
DefaultMutableTreeNode initNodes(){
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
DefaultMutableTreeNode sub1 = new DefaultMutableTreeNode("sub1");
DefaultMutableTreeNode sub2 = new DefaultMutableTreeNode("sub1");
DefaultMutableTreeNode sub1_1 = new DefaultMutableTreeNode("sub1_1");
DefaultMutableTreeNode sub1_2 = new DefaultMutableTreeNode("sub1_2");
DefaultMutableTreeNode sub2_1 = new DefaultMutableTreeNode("sub2_1");
DefaultMutableTreeNode sub2_2 = new DefaultMutableTreeNode("sub2_2");
root.add(sub1);
root.add(sub2);
sub1.add(sub1_1);
sub1.add(sub1_2);
sub2.add(sub2_1);
sub2.add(sub2_2);
return root;
}
public static void main(String[] args) {
new TreeDemo();
}
}
class ButtonRenderer implements TreeCellRenderer {
private JButton button;
public ButtonRenderer() {
button = new JButton("Button");
}
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
return button;
}
}
这是正在运行的应用程序的屏幕截图...
推荐阅读
- reactjs - 如何将 rootUrl 设置为自动添加到 next.js 中的相对 url?
- c# - 托管服务中数据库上下文的并发问题
- linux - 鼠标拖动在 X 中发送按键(keycode 54,keysym 字符“c”)
- javascript - 尝试将 SMS 参与者添加到 JS 中的 twilio 对话 - 错误 20403 - 403 禁止
- r - 即使不需要,如何在 R 的 quote() 中保留“反引号”?
- excel - 动态反转数组列表
- google-sheets - 如何在自动填充 Google 表格单元格时迈出“大步”?
- java - 查找 MUSIC_STREAM 是否处于活动状态
- php - 使用 Goutte 爬取表格
- javascript - 如何获取元素的所有基本属性