繁体   English   中英

用鼠标单击时如何从JTable行获取信息?

[英]How to get information from a JTable row when clicking on it with mouse?

我有一个存储学生,课程,他们正在学习的内容等的应用程序。该应用程序连接到SQL数据库。 我没有问题,可以通过应用程序在数据库中插入或搜索内容。 但是我仍然没有找到一种简单的方法来通过我的应用程序删除表中的行。 就像搜索和插入一样,我可以使用userinput来删除行(例如JTextFields),但是我想要一种更简单的方法。 所以我发现,如果我在表格中添加一个popupmenu,那么我可以右键单击一行并使其显示为“ Delete row”,如下所示

在此处输入图片说明

但是现在,我想在该行中获取信息,以便可以将其发送到我的框架,控制器以及以后的数据库中,但是我不知道该怎么做。 在此示例中,我想像您想象的那样在字符串中获取“ Lars”,在int变量中获取“ 12”。 到目前为止,我已经创建了执行图片操作的代码。 我删除了一些代码,因此更容易了解我在这里得到的内容。 任何帮助表示赞赏!

    table = new JTable(studentTableModel);
    popup = new JPopupMenu();

    JMenuItem removeItem = new JMenuItem("Delete student");
    popup.add(removeItem);

    table.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {

            int row = table.rowAtPoint(e.getPoint());

            table.getSelectionModel().setSelectionInterval(row, row);

            if(e.getButton() == MouseEvent.BUTTON3) {
                popup.show(table, e.getX(), e.getY());
            }
        }
    });

    removeItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            int row = table.getSelectedRow();

            if(studentTableListener != null) {
                studentTableListener.rowDeleted(row);
                studentTableModel.fireTableRowsDeleted(row, row);
            }
        }
    });`

有几种方法可以解决此问题。

数组列表

您可以声明一个最终的ArrayList来跟踪学生。 这样,您可以跟踪个别学生的删除情况。 缺点是您无法撤消删除操作,因此您必须清除阵列并重置模型,否则它将无法正确表示数据库。

    final ArrayList<Student> list = new ArrayList<Student>();

    removeItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            int row = table.getSelectedRow();

            if(studentTableListener != null) {

                Student student = new Student();
                student.setName(studentTableModel.getValueAt(...));
                //get the values from the row and fill a Student object
                list.add(student);

                studentTableListener.rowDeleted(row);
                studentTableModel.fireTableRowsDeleted(row, row);
            }
        }
    });

然后,只要传播到数据库,就可以遍历列表。

for(Student s : list) {
    //do call to delete s from database
}

然后清除列表。

list.clear();

撤消活动

可以在此处找到有关如何实现更复杂的JTable的教程 这将允许您回滚删除和更改。 我没有与此相关的特定代码(它明显更大,但是更好地支持JTable)。

但是,您基本上会为行删除创建自己的UndoAction,并让它存储要删除的行。

每当您执行删除操作时,您都将存储RowDeleteUndo事件,该事件存储所有已删除值的数组。 然后,您可以覆盖toString()方法或创建一个新方法,以在Student对象中获取所有值。

然后,在提交时,您从撤消树中取出堆栈,并向后遍历它(默认情况下是后进先出),如果要镜像用户的操作,则按该顺序提交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM