当您单击每个树节点时,我想将要添加的信息放入 jpanel jscrollpane

I would like to put the information to add in jpanel jscrollpane when you click each tree node

我想在您单击每个树节点时将要添加的信息放入 jpanel jscrollpane 中...请...!!!

1.I 想要在 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<Viewer> ViewArr = new ArrayList<Viewer>();
    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,您并没有向 class 添加任何新功能(也没有实际使用它),相反,只需创建一个 JTree 的实例并将其传递给它一个实例 a TreeModel 来模拟您的数据。

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

获得此信息后,您就可以决定将其提供给相应视图的最佳方式。因为你用的是DefaultMutableTreeNode,你可以给它关联一个userObject,这样可以更容易地用每个节点存储复杂的数据。

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

查看 How to Use Trees 了解更多详情

例如...

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 变量的状态,该状态很容易不反映现实,而是依赖您可以从 [=46] 的状态中确定的实际已知值=].

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