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

2024-03-17

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

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

树.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;
    }
}

框架.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();
    }
}

查看器.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,您没有向该类添加任何新功能(也没有实际使用它),而是只是创建一个实例JTree并传递一个实例 aTreeModel它对您的数据进行建模。

这意味着您可以自由添加TreeListSelection to the JTree,它会告诉您选择何时发生变化。从结果来看TreeSelectionEvent你可以获得所选的path,它将告诉您从根到当前选定的节点选择的组件。然后您可以使用getLastPathComponent获取路径中的最后一个节点(这将是选定的节点)。

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

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

看一下如何使用树木 http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html更多细节

例如...

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 或模型的状态,然后单独查找数据(恕我直言)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我想在单击每个树节点时将信息添加到 jpanel jscrollpane 中 的相关文章

随机推荐

  • Java:具有非静态文件名的 Zip 文件

    我在这篇文章中找到了这个 ZipUtils 类 如何使用java压缩文件夹本身 https stackoverflow com questions 15968883 how to zip a folder itself using java
  • 使用共享图像库使用托管磁盘的 Terraform Azure VM

    类似问题 Terraform 计划在重新运行共享图像库中存储的自定义图像时销毁并替换 Azure VM https stackoverflow com questions 64050815 terraform plan destroying
  • BrowserRouter 与打字稿反应

    我在 Reactjs 类型脚本中有简单的应用程序 我正在尝试使用react router dom 中的BrowserRouter 这是我的代码 import as React from react import Popular from p
  • 删除其他用户正在访问的数据库?

    我尝试从 PgAdmin 3 删除数据库 但收到以下错误消息 ERROR can t delete current database SQL state 55006 我怎样才能强制删除 修复这个数据库的这个错误 这个帖子 http www
  • 逐行读取文件而不是将文件读入内存

    我在逐行读取文件而不是将文件读入内存时遇到一些麻烦 截至目前 我正在将文件读入内存 并且运行完美 但是 如果我尝试逐行读取文件 当我输入 print B 时 我只会得到零 我的问题是 有人有一个好的命令可以在 python 中逐行读取文件吗
  • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml后kube-apiserver如何重启

    我使用安装了 kuberneteskubeadm 为了启用基本身份验证 我添加了 basic auth file etc kubernetes user password txt in my etc kubernetes manifests
  • Jquery/HTML5/Ajax上传进度条?

    我正在开发一个简单的 S3 上传器 让它执行并完成我需要做的事情 但是 我想知道是否有一个易于创建上传进度条的方法 在浏览器的底部 有一条浏览器消息 上面写着 正在上传 是否有任何人知道有关该消息的文章以显示加载栏 理想情况下 该变量将传递
  • 在 SymPy 中,为什么我的解决方案(nonlinsolve)返回错误的答案?

    我有一个由 3 个方程组成的系统 我想找到以下交线或零斜线的解dx dy from sympy import x y z symbols x y z dx x x 3 3 z y dy y 2 0 1 z dz 0 xy nullcline
  • 如何检查 Makefile 中是否存在文件以便将其删除?

    在我的干净部分Makefile我试图在永久删除之前检查该文件是否存在 我使用此代码但收到错误 它出什么问题了 if a myApp then rm myApp fi 我收到此错误消息 if a myApp bin sh Syntax err
  • 独立的共享库

    我需要创建一个共享库 其自身的依赖项 包括 libc libstdc 必须静态链接到它以生成独立的二进制文件 我尝试这样做 g c fpic o foo o foo cpp g static shared o foo so foo o 失败
  • symfony 中的 Doctrine 可搜索行为与 Zend Lucene

    我需要在2个表中搜索关键字 简单的事情 我尚未决定使用其中之一吗 有什么建议吗 Thanks 正如 cuhuak 提到的 Lucene 是全文搜索 由于它是用 Java 编写的 因此您还需要一个 Java 服务器 例如 Tomcat 如果您
  • Swift 中 SQLite 项目中的 UnsafePointer 问题

    我们在 iOS 和 Swift 中实现 SQLite 不使用包装器或 Objective C 桥接 一切工作正常 除了执行查询和提取结果时 问题在于UnsafePointer
  • Nodejs回调机制——哪个线程处理回调?

    我是 NodeJS 的新手 对 Node js 的单实例模型感到好奇 在一个简单的nodeJs应用程序中 当使用回调异步处理某些阻塞操作时 运行nodeJs的主线程是否也会处理回调 如果请求是从数据库中获取一些数据 并且有 100 个并发用
  • 如何处理 REST 调用、数据持久化、同步和观察 ContentProvider

    我知道这个问题已经被问了太多次了 但我认为我想要解决的问题有点不同 也许更复杂 我将开发一个使用RESTful Web 服务并需要具备以下要求 该应用程序应该以列表和详细方式显示一些书籍及其作者和编辑 该应用程序还应该允许搜索书籍 书籍 作
  • Android - 为什么对地理围栏使用待处理意图

    我刚刚完成了 Android 上的地理围栏教程 http developer android com training location geofencing html http developer android com training
  • Swift3 的所有 UIView 中都有不同的字体,每个都有本地化

    我想使用不同的字体直至每种语言 例如 英语中的 roboto 法语中的 openSans 本土化 arrayOfTitle NSLocalizedString comment comment 0 NSLocalizedString prof
  • 如何使用c++中的sort函数对二维数组进行排序?

    我有一个n x m我需要排序的数组 但是 我只需要查看每个一维数组的第一个值即可对较大的数组进行排序 例如 考虑以下二维数组 1 2 4 4 3 5 我不关心子数组中的第二个值 我只需要查看子数组的第一个值即可对其进行排序 所以 我只会看1
  • 在文件中执行 pgsql 命令的 Shell 脚本

    我正在尝试自动化一组创建模板数据库的过程 我有一组文件 file1 file2 fileN 每个文件都包含创建 TEMPLATE 数据库所需的一组 pgsql 命令 文件 创建的 template1 sql 的内容大致如下 CREATE D
  • 如何成为 iOS 的 MDM 供应商

    对此做了很多研究 看到了几个意见 很少有人说我需要苹果企业帐户 也很少有人说我不需要 拥有 MAC 服务器会有帮助吗 我是否需要拥有企业帐户才能成为 MDM 供应商 任何指点都会很棒 我看到了MDM提供的技术业务文档 但它没有解释任何关于服
  • 我想在单击每个树节点时将信息添加到 jpanel jscrollpane 中

    我想在单击每个树节点时将要添加的信息添加到 jpanel jscrollpane 中 请 1 我想控制在Tree java中选择的树节点的状态 其中Frame java 树 java package pms import java awt