如何使用JTree侦听器动态更改具有CardLayout的JPanel?

菲利普·莫里斯

我正在尝试使用JTree的内容使用CardLayout更改面板。它仅适用于最后一个选择。我应该对我的代码执行哪些侦听器或更改?

我也在控制台中编写了文本,它似乎获得了正确的值。这就是为什么它让我感到沮丧。

单击第一级节点时,我的代码应显示第一级;单击第二级节点时,我的代码应显示第二级。我用了

DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
                                .getLastSelectedPathComponent();

并且只影响最后的组成部分。我该如何解决?谢谢!

源代码:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class ProblemTree2 extends JFrame {

    private DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
    private DefaultTreeModel model = new DefaultTreeModel(root);
    private JTree tree = new JTree(model);
    private JPanel card;

    public ProblemTree2() {

        card = new JPanel(new CardLayout());
        card.setBorder(BorderFactory.createLineBorder(Color.BLACK));

        JLabel label1 = new JLabel("1st level");
        JLabel label2 = new JLabel("2nd level");

        DefaultMutableTreeNode n1 = new DefaultMutableTreeNode(
                "1st level: Child 1");
        n1.add(new DefaultMutableTreeNode("2nd level: Child l"));
        DefaultMutableTreeNode n2 = new DefaultMutableTreeNode(
                "1st level: Child 2");
        n2.add(new DefaultMutableTreeNode("2nd level: Child 2"));
        DefaultMutableTreeNode n3 = new DefaultMutableTreeNode(
                "1st level: Child 3");
        n3.add(new DefaultMutableTreeNode("2nd level: Child 3"));


        card.add(label1,"1st level: Child 1");
        card.add(label1,"1st level: Child 2");
        card.add(label1,"1st level: Child 3");

        card.add(label2,"2nd level: Child l");
        card.add(label2,"2nd level: Child 2");
        card.add(label2,"2nd level: Child 3");

        root.add(n1);
        root.add(n2);
        root.add(n3);

        tree.setEditable(true);
        tree.setSelectionRow(0);
        tree.setRootVisible(true);
        tree.setShowsRootHandles(true);


        tree.getSelectionModel().addTreeSelectionListener(
                new TreeSelectionListener() {
                    @Override
                    public void valueChanged(TreeSelectionEvent e) {

                        final CardLayout cards = (CardLayout) card
                                .getLayout();
                        DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
                                .getLastSelectedPathComponent();
                        System.out.println(selectedNode.toString());
                        cards.show(card,selectedNode.toString());
                    }
                });


        JScrollPane scrollPane = new JScrollPane(tree);
        scrollPane.setPreferredSize(new Dimension(500,500));
        getContentPane().add(scrollPane, BorderLayout.WEST);
        getContentPane().add(card, BorderLayout.CENTER);

        setSize(1000, 600);
        setVisible(true);
    }

    public static void main(String[] arg) {
        ProblemTree2 pt = new ProblemTree2();
    }
}
疯狂程序员

这个...

card.add(label1, "1st level: Child 1");
card.add(label1, "1st level: Child 2");
card.add(label1, "1st level: Child 3");

card.add(label2, "2nd level: Child l");
card.add(label2, "2nd level: Child 2");
card.add(label2, "2nd level: Child 3");

导致您的问题,您不能为一个组件的同一实例分配多个键。

当您尝试第二次添加组件时,首先将其从其父容器CardLayout中删除,这也导致删除了“名称”,仅意味着行...

card.add(label1, "1st level: Child 3");
// and...
card.add(label2, "2nd level: Child 3");

正在实际运行(已添加到UI /中CardLayout

您将必须为每个名称提供该组件的新实例。

另外,您可以向您提供更多详细信息,TreeNode以便确定它是哪个级别并显示该级别的正确组件,这意味着您只有两个组件,CardLayout每个级别一个。

DefaultMutableTreeNode允许您在“用户”提供Object给它。默认情况下,它使用toString该对象方法作为节点的文本,但是您可以使用TreeCellRenderer来自定义此对象或为toString“自定义级别”对象方法提供值

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有动作侦听器的JButtons Swing的动态

如何检查按钮是否具有单击侦听器

Spring Kafka-如何使用多个具有不同配置的侦听器配置单个ListenerContainerFactory

如何使用带有事件学说的事件侦听器更改相关实体

如果我的点击侦听器没有冒泡,如何使用点击侦听器定位动态添加的 HTML 元素的父元素?

如何在 JQuery 中为动态创建的具有相同类名的链接添加事件侦听器?

使用侦听器动态创建TextView

JPanel键侦听器

具有双向绑定的可观察字段用法(删除属性更改侦听器)

具有2个EditText字段的文本更改侦听器

如何使用具有一系列端口的侦听器在Ansible中定义AWS ELB

如何在具有 Animator 的 GameObject 之外添加 AnimationEvent 接收器/侦听器?

使用事件侦听器检测更改时,为什么图标类没有更改?

如何为没有JQuery动态创建的元素创建事件侦听器

如何使用值更改侦听器更改JSF页面中的语言环境?

如何将键侦听器更改为鼠标侦听器

如何从具有匿名功能的div中删除事件侦听器

如何为具有 1 个分区的 Kafka 主题创建并发消息侦听器

如何在类内的html中添加具有函数回调的事件侦听器?

JavaFX:如何创建具有不同侦听器主体的应用程序实例

ValueProperty更改侦听器

Firestore是否具有与Firebase的childAdded等效的侦听器(使用swift)?

使用 RBAC (Envoy) 允许具有 TCP 侦听器的 IP

使用jest测试具有异步功能侦听器的eventEmitter

在具有各种侦听器的 for 循环中使用 addEventListener()

在焦点侦听器中更改复合可绘制对象时,EditText具有无限触发的焦点更改事件

如何检查是否存在动态附加的事件侦听器?

如何动态添加Vue生命周期侦听器

如何添加动态侦听器并获取目标值