首页 > 解决方案 > 为什么添加到 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();
    }
}

上面代码的结果截图

标签: javaswinguser-interface

解决方案


事件虽然JLabelextends 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;
    }
}

这是正在运行的应用程序的屏幕截图...

树演示


推荐阅读