java - 如何使用 JTree Listener 动态更改带有 CardLayout 的 JPanel?

标签 java swing listener jtree cardlayout

我正在尝试使用 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 允许您向其提供一个“用户”对象。默认情况下,它使用此对象的 toString 方法作为节点的文本,但您可以使用 TreeCellRenderer 自定义此方法或为 提供值“自定义级别”对象的 toString 方法

关于java - 如何使用 JTree Listener 动态更改带有 CardLayout 的 JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30158612/

相关文章:

java - 如何使用 Maven 程序集插件将 war 捆绑到 package/.zip 中

java - 如何使用Retrofit2 POST数据?

java - 在 JFreeChart XYPLot 中改变单点的形状

java - DefaultTableModel 不刷新

Java swing改变JPanel图像

javascript - WebkitAnimationEnd 没有触发。谁能明白为什么?

java - 指定 groovy-variable 的类型

java - 检查 JFrame 是否可见(另一个程序不在它前面)

javascript - iframe 和父级之间的事件通知

android - GpsStatus.Listener 仅在 GPS 开启时有效