Почему JButton не добавляется в отображение DefaultTreeCellRenderer? - PullRequest
0 голосов
/ 30 сентября 2019

Я пишу подкласс DefaultTreeCellRenderer, внутри метода getTreeCellRendererComponent, я добавил 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();
    }
}

Снимок экрана с результатом кода выше

1 Ответ

0 голосов
/ 30 сентября 2019

Событие, хотя JLabel расширяет 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;
    }
}

А вот снимок экрана работающего приложения ...

tree demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...