【问题标题】:Retrieving values from properties file when key node is clicked in JTree在 JTree 中单击关键节点时从属性文件中检索值
【发布时间】:2014-08-21 10:27:16
【问题描述】:

我有一个 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 
     }
}

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

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布 SSCCE/MCVE,简短、可运行、可编译,并带有 JTree/TreeModel 的硬编码值
  • 发布我的整个代码会更好吗?
  • :-) 是的,它应该是简短的、可运行的、可使用 JTree/TreeModel 的硬编码值进行编译
  • 好吧,我只使用一个类,但它不是很短,但我不能减少它,否则它不会运行,可以继续发布这个类还是太多了?
  • 对我来说似乎没有多大意义,先加载键然后再加载值。同时做这一切!将每个键/值对存储为NamedAttribute(或其他有意义的东西)。使用适当的渲染器(显示键)将 NamedAttribute 对象放入树中。

标签: java swing panel key-value jtree


【解决方案1】:

我假设您的问题是您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,就像已经向你建议的那样。

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

【讨论】:

  • 这非常有帮助,非常感谢 - 我已经阅读了教程,唯一让我难过的是在单击各个键后将相应的值从属性文件中放入面板中。我所看到的一切似乎都有硬编码值,这不是我的工作方式:(
  • 从一般的角度来看,硬编码这些属性和从文件中加载它们并没有太大区别。我将其抽象出来,以便专注于与您的问题相关的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2015-09-29
  • 2016-02-13
相关资源
最近更新 更多