当您单击每个树节点时,我想将信息添加到jpanel jscrollpane中

当你点击每个树节点时,我想把信息添加到jpanel jscrollpane中……请… !!!

1.我想在Tree.java中控制那个状态选择的树节点,其中Frame.java

Tree.java

package pms; import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; public class Tree extends JTree { private JTree tree; public static int selectItem = 0; public JTree CreateTree() { setLayout(new BorderLayout()); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Management"); DefaultMutableTreeNode bigLeaf1 = new DefaultMutableTreeNode("Generl Affair"); DefaultMutableTreeNode bigLeaf2 = new DefaultMutableTreeNode("Personal Affair"); final DefaultMutableTreeNode leaf2 = new DefaultMutableTreeNode("Recruit"); final DefaultMutableTreeNode leaf3 = new DefaultMutableTreeNode("test"); bigLeaf1.add(leaf2); bigLeaf2.add(leaf3); root.add(bigLeaf1); root.add(bigLeaf2); tree = new JTree(root); tree.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { TreePath tp = tree.getPathForLocation(e.getX(), e.getY()); if (e.getClickCount() >= 2) { if (tp.getLastPathComponent() == leaf2) { selectItem = 2; System.out.println(selectItem); } else if (tp.getLastPathComponent() == leaf3) { selectItem = 3; System.out.println(selectItem); } } } }); return tree; } public int selectedItem() { return selectItem; } } 

Frame.java

 package pms; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import javax.swing.UIManager; public class Frame extends JFrame implements Runnable { static int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED; static int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED; private JPanel pan1, pan2, pan3, pan4; public static JScrollPane jsp2; public Tree tree; public static ArrayList ViewArr = new ArrayList(); public static int selectItem = 0; public Frame() { setTitle("Personal Management System"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(null); // AbsoulteLayout /** Create MenuBar */ menuBar menubar = new menuBar(); setJMenuBar(menubar.CreateMenuBar()); pan1 = new JPanel(new GridLayout()); // TreeNode ScrollPane pan2 = new JPanel(new BorderLayout()); // toolbar & ScrollPane2 pan1.setBounds(0, 0, 350, 950); // Fixed Panel Size pan2.setBounds(350, 0, 1300, 950); getContentPane().add(pan1); getContentPane().add(pan2); /** Create Tree */ tree = new Tree(); JScrollPane jsp1 = new JScrollPane(tree.CreateTree(), v, h); pan1.add(jsp1); /** Create toolbar Panel */ pan3 = new toolBar().CreateToolbar(); pan2.setLayout(new BorderLayout()); pan2.add(pan3, "North"); /** Create viewer ScrollPane */ jsp2 = new JScrollPane(v, h); jsp2.setBackground(Color.cyan); pan2.add(jsp2, "East"); setSize(1300, 950); setVisible(true); } public void ShowInterViewer() { selectItem = tree.selectedItem(); try { if (selectItem == 2) { System.out.println("222"); } else if (selectItem == 3) { System.out.println("333"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { Frame frame = new Frame(); frame.run(); SwingUtilities.invokeLater(new Runnable() { public void run() { } }); } @Override public void run() { // TODO Auto-generated method stub ShowInterViewer(); } } 

Viewer.java

  package pms; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Date; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class Viewer extends JPanel implements ActionListener{ private JPanel jp; private JTextField tf1, tf2, tf3, tf4, tf5, tf6; private JLabel lb1, lb2, lb3, lb4, lb5, lb6; private JButton btn1; private String name, sex, pass, phone, picturePath, filePath; private Date birthday, interviewDate; public Viewer(String name, Date birthday, String sex, Date interviewDate, String pass, String phone) { setName(name); setSex(sex); setPass(pass); setPass(pass); CreateViewer(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { if(sex.equals("M")){ this.sex = "남자"; }else if(sex.equals("W")){ this.sex = "여자"; } } public String getPass() { return pass; } public void setPass(String pass) { if(pass.equals("Y")){ this.pass = "합격"; }else if(pass.equals("N")){ this.pass = "불합격"; } } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getPicturePath() { return picturePath; } public void setPicturePath(String picturePath) { this.picturePath = picturePath; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Date getInterviewDate() { return interviewDate; } public void setInterviewDate(Date interviewDate) { this.interviewDate = interviewDate; } public JPanel CreateViewer(){ jp = new JPanel(new BorderLayout()); tf1 = new JTextField(getName()); tf1.setColumns(20); //tf1.setBounds(50,50,10,10); tf2 = new JTextField(); tf2.setColumns(20); tf3 = new JTextField(); tf3.setColumns(20); tf4 = new JTextField(); tf4.setColumns(20); tf5 = new JTextField(); tf5.setColumns(20); tf6 = new JTextField(); tf6.setColumns(20); lb1 = new JLabel("이름"); lb2 = new JLabel("생년월일"); lb3 = new JLabel("성별"); lb4 = new JLabel("면접일자"); lb5 = new JLabel("합격여부"); lb6 = new JLabel("연락처"); btn1 = new JButton("이력서 보기"); jp.add(tf1); jp.add(tf2); jp.add(tf3); jp.add(tf4); jp.add(tf5); jp.add(tf6); jp.add(lb1); jp.add(lb2); jp.add(lb3); jp.add(lb4); jp.add(lb5); jp.add(lb6); jp.add(btn1); return jp; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } } 

首先,你真的不需要扩展一个JTree ,你没有向该类添加任何新function(你也没有实际使用它),而只是创建一个JTree实例并将一个实例传递给TreeModel为您的数据建模。

这意味着您可以自由地向JTree添加TreeListSelection ,它将告诉您选择何时更改。 从生成的TreeSelectionEvent您可以获取所选path ,该path将告诉您从根目录中选择的组件到当前选定的节点。 然后,您可以使用getLastPathComponent获取路径中的最后一个节点(将是所选节点)。

获得此信息后,您就可以决定如何将其提供给相应的视图。 因为您正在使用DefaultMutableTreeNode ,所以可以将userObject与它关联,这样可以更轻松地为每个节点存储复杂数据。

基于您的Viewer类,似乎数据非常普遍,在这种情况下,我会考虑创建POJO,它维护所有相关数据并将其简单地应用于DefaultMutableTreeNode ,这样您就可以使用getUserObject轻松提取它。 然后,您只需将此对象传递给Viewer面板(通过某种设置器),然后让查看器相应地更新它自己的状态

有关更多详细信息,请查看如何使用树

例如…

树

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.text.DateFormat; import java.time.LocalDate; import java.time.Month; import java.util.Date; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; 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.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; public class InterviewBrowser { public static void main(String[] args) { new InterviewBrowser(); } public InterviewBrowser() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } DefaultMutableTreeNode root = new DefaultMutableTreeNode("Management"); DefaultMutableTreeNode bigLeaf1 = new DefaultMutableTreeNode("Generl Affair"); DefaultMutableTreeNode bigLeaf2 = new DefaultMutableTreeNode("Personal Affair"); DefaultMutableTreeNode leaf2 = new DefaultMutableTreeNode(new InterviewHistory( "Bob", new Date(LocalDate.of(1972, Month.MARCH, 8).toEpochDay()), Sex.MALE, new Date(LocalDate.of(2015, Month.AUGUST, 10).toEpochDay()), false, "123456789")); DefaultMutableTreeNode leaf3 = new DefaultMutableTreeNode(new InterviewHistory( "Jane", new Date(LocalDate.of(1973, Month.JANUARY, 1).toEpochDay()), Sex.FEMALE, new Date(LocalDate.of(2015, Month.AUGUST, 10).toEpochDay()), true, "87654321")); bigLeaf1.add(leaf2); bigLeaf2.add(leaf3); root.add(bigLeaf1); root.add(bigLeaf2); DefaultTreeModel model = new DefaultTreeModel(root); JTree tree = new JTree(model); Viewer viewer = new Viewer(); tree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { TreePath path = e.getPath(); Object lastPathComponent = path.getLastPathComponent(); if (lastPathComponent instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) lastPathComponent; Object userObject = node.getUserObject(); if (userObject instanceof InterviewHistory) { InterviewHistory history = (InterviewHistory) userObject; viewer.setHistory(history); } else { viewer.setHistory(null); } } else { viewer.setHistory(null); } } }); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(tree), BorderLayout.WEST); frame.add(viewer); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public enum Sex { MALE, FEMALE } public class InterviewHistory { private String name; private Date birthDate; private Sex sex; private Date interviewDate; private boolean passed; private String phone; public InterviewHistory(String name, Date birthDate, Sex sex, Date interviewDate, boolean passed, String phone) { this.name = name; this.birthDate = birthDate; this.sex = sex; this.interviewDate = interviewDate; this.passed = passed; this.phone = phone; } public String getName() { return name; } public Date getBirthDate() { return birthDate; } public Sex getSex() { return sex; } public Date getInterviewDate() { return interviewDate; } public boolean didPass() { return passed; } public String getPhone() { return phone; } @Override public String toString() { return getName(); } } public static class Viewer extends JPanel { public static final DateFormat DATE_FORMAT = DateFormat.getDateInstance(); private JTextField name; private JTextField dateOfBirth; private JLabel sex; private JTextField dateOfInterview; private JCheckBox passed; private JTextField phone; public Viewer() { setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.WEST; add(new JLabel("Name: "), gbc); gbc.gridy++; add(new JLabel("Date of birth: "), gbc); gbc.gridy++; add(new JLabel("Sex: "), gbc); gbc.gridy++; add(new JLabel("Date of Interview: "), gbc); gbc.gridy++; add(new JLabel("Passed interview: "), gbc); gbc.gridy++; add(new JLabel("Phone: "), gbc); name = new JTextField(25); dateOfBirth = new JTextField(10); sex = new JLabel("?"); dateOfInterview = new JTextField(10); passed = new JCheckBox(); phone = new JTextField(9); gbc.gridx++; gbc.gridy = 0; add(name, gbc); gbc.gridy++; add(dateOfBirth, gbc); gbc.gridy++; add(sex, gbc); gbc.gridy++; add(dateOfInterview, gbc); gbc.gridy++; add(passed, gbc); gbc.gridy++; add(phone, gbc); } public void setHistory(InterviewHistory history) { name.setText(history == null ? null : history.getName()); dateOfBirth.setText(history == null ? null : DATE_FORMAT.format(history.getBirthDate())); sex.setText(history == null ? "?" : history.getSex().name()); dateOfInterview.setText(history == null ? null : DATE_FORMAT.format(history.getInterviewDate())); passed.setSelected(history == null ? false : history.didPass()); phone.setText(history == null ? "?" : history.getPhone()); } } } 

不要依赖于static变量的状态,对于该状态而言,不要反映现实是很容易的,而是依赖于您可以从视图/模型的状态确定的实际已知值。

任何模型的目的是为您提供显示数据的机制,您应该使用它来直接包装数据,而不是试图猜测UI或模型的状态,然后单独查找数据(恕我直言)