java - 在 JTree 中单击关键节点时从属性文件中检索值

标签 java swing panel key-value jtree

我有一个 Jtree,它显示属性文件中的所有键 - 但是,当我单击一个节点时,我希望它获取与当前所选键相关的值并将其显示在 Jtree 右侧的面板中。我的代码如下,如果有人知道我如何显示,这将有很大帮助!

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Rectangle;
import java.io.FileInputStream;
import java.util.Properties;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeSelectionModel;
import net.miginfocom.swing.MigLayout;

public class HelpSystem implements TreeSelectionListener {

    private static final long serialVersionUID = 1L;
    private JFrame frame;
    private JTextField textFieldSearch;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {                   
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InstantiationException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (UnsupportedLookAndFeelException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    HelpSystem window = new HelpSystem();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public HelpSystem() {
        frame = new JFrame();
        frame.setBounds(100, 100, 842, 516);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new MigLayout("", "[grow]", "[][grow]"));
        JSplitPane splitPane = new JSplitPane();
        frame.getContentPane().add(splitPane, "cell 0 1,grow");
        JPanel panel = new JPanel();
        splitPane.setRightComponent(panel);
        panel.setLayout(new MigLayout("", "[]", "[]"));
        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        splitPane.setLeftComponent(tabbedPane);
        JPanel panelSearch = new JPanel();
        panelSearch.setPreferredSize(new Dimension(7, 10));
        tabbedPane.addTab("Search", null, panelSearch, null);
        panelSearch.setLayout(new MigLayout("", "[][][]", "[][][][][][][][][]"));
        JLabel lblSearchForGit = new JLabel("Search for Git command:");
        panelSearch.add(lblSearchForGit, "cell 0 1,alignx center");
        textFieldSearch = new JTextField();
        panelSearch.add(textFieldSearch, "cell 0 3,growx");
        textFieldSearch.setColumns(10);
        JLabel lblSearchForGit_1 = new JLabel("search for git command to display info in the right");
        panelSearch.add(lblSearchForGit_1, "cell 0 8");
        JPanel panelLookup = new JPanel();
        panelLookup.setToolTipText("Lookup a command");
        tabbedPane.addTab("Lookup", null, panelLookup, null);
        panelLookup.setLayout(new MigLayout("", "[grow][grow]", "[grow][grow][][][][][][][][][][]"));
        JScrollPane scrollPane = new JScrollPane();
        panelLookup.add(scrollPane, "flowx,cell 0 0 2 11,grow");
        ///Area related to displaying JTree inside jpanel /////
        JPanel panel_1 = new JPanel();
        panel_1.setBackground(Color.WHITE);
        panel_1.setSize(new Dimension(22, 0));
        scrollPane.setViewportView(panel_1);
        Properties properties = new Properties();
        try {
            //properties file - get the data in the file
            String filename = "GitCommands.properties";
            // Properties p =System.getProperties();
            Properties p = properties;
            FileInputStream fileInputStream = new FileInputStream(filename);
            //load properties file  
            properties.load(fileInputStream);
            panel_1.setLayout(new MigLayout("", "[64px][][][][][][][]", "[322px,grow,fill][][]"));
            //sets up a scroll pane to view all of the tree
            JScrollPane scrollpane = new JScrollPane();
            //frame.getContentPane().add(scrollpane, "Center");
            panel_1.add(scrollpane, "cell 0 5,alignx left,aligny top");

            //what will happen when the user closes the program
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //sets new jtree
            final JTree tree = new JTree(p);
            //Where the tree is initialized:
            tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
            //Listen for when the selection changes.
            tree.addTreeSelectionListener(this);
            panel_1.add(tree, "cell 7 0 1 3");
            tree.setAlignmentX(Component.RIGHT_ALIGNMENT);
            tree.setBounds(new Rectangle(0, 0, 40, 0));
            tree.setToolTipText("Click a command");
            //sort in to order
            //allows the root of the tree to be shown
            tree.setRootVisible(true);
            //re size the width
            tree.setSize(20, 10);
            //it will be visible
            frame.setVisible(true);
        } catch (Exception e) {
        }
    }

    @Override
    public void valueChanged(TreeSelectionEvent e) {
        //
    }
}

然后我有我的方法来监听节点被单击的事件

private void createSelectionListener(Object node) {
     //if nothing is selected  
     if (node == null) return;
          // retrieve the node that was selected 
          Object nodeInfo = ((DefaultMutableTreeNode) node).getUserObject();
          // What happens when node is clicked 
     }
}

我只是不确定在下面放什么//单击节点以使其显示时会发生什么?

最佳答案

我假设您的问题是您的问题的延续 asked before 。你想要的是利用 Tree Selection Listener .

import java.awt.BorderLayout;
import java.util.Properties;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;


public class GetAllProperties extends JFrame {

    private static final String NOTHING_SELECTED = "<nothing selected>";

    private final JScrollPane treeScroll;
    private final JTree tree;
    private final DefaultTreeModel treeModel;
    private final DefaultMutableTreeNode root;
    private final JLabel descriptionLabel;

    private Properties properties;

    public GetAllProperties() {
        setLayout(new BorderLayout());

        root = new DefaultMutableTreeNode("GIT commands");
        treeModel = new DefaultTreeModel(root);
        tree = new JTree(treeModel);
        treeScroll = new JScrollPane(tree);
        add(treeScroll, BorderLayout.WEST);

        populateTree();        

        descriptionLabel = new JLabel(NOTHING_SELECTED);
        add(descriptionLabel, BorderLayout.CENTER);

        tree.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode selection = 
                        (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
                if (selection != null) {
                    String key = (String)selection.getUserObject();
                    String command = properties.getProperty(key);
                    descriptionLabel.setText(command);
                } else {
                    descriptionLabel.setText(NOTHING_SELECTED);
                }
            }
        });

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new GetAllProperties().setVisible(true);
            }
        });
    }

    private void populateTree() {
        // fake properties in order to avoid IO
        properties = new Properties();
        properties.setProperty("foo1", "bar1");
        properties.setProperty("foo2", "bar2");
        properties.setProperty("foo3", "bar3");
        properties.setProperty("foo4", "bar4");

        Set<Object> keySet = properties.keySet();
        for (Object key : keySet) {
            root.add(new DefaultMutableTreeNode(key));
        }

        tree.expandPath(new TreePath(root));
    }

}

您确实应该考虑阅读并理解 How to use Trees tutorial ,就像已经向您建议过一样。

我想用上面的代码回答你之前的问题,但是太晚了,所以你就开始吧。

关于java - 在 JTree 中单击关键节点时从属性文件中检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423977/

相关文章:

c# - 如何从 asp :panel 获取文本属性

java - MySQL JDBC 驱动 & FLOAT(N, M) 列类型

Java event.getKeyCode 错误

java - BufferedImage.getGraphics() 导致内存泄漏,有解决办法吗?

java - 从另一个类调用paint()方法?

Java Pong 球和 Racket 不可见

java - Swing:面板尺寸问题

java - 在真实的基于 Java 的企业应用程序中,应该在哪一层进行验证?

java - DataTable服务器端处理的数据结构

java - 无法启动 Spring Boot 应用程序