【发布时间】: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