java - JTable 上的监听器出现问题(执行代码太多次)

标签 java swing jtable mouseevent listener

我目前正在尝试在 Jtable 上使用监听器,但事实证明,表中的每个项目都会调用一次事件,这使得速度非常慢。 这是我正在使用的代码:

tabProductos.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
            int idProducto = (int) tabProductos.getValueAt(tabProductos.getSelectedRow(), 0);
            System.out.println(idProducto);
            asignarProdcuto(idProducto);
        }
    }
});

同样的事情发生在另一个监听器上:

tabProductos.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (!tabProductos.getSelectionModel().isSelectionEmpty()) {
            int idProducto = (int) tabProductos.getValueAt(tabProductos.getSelectedRow(), 0);
            System.out.println(idProducto);
            asignarProdcuto(idProducto);
        }
    }
});

变量“idProducto”的打印次数与表中的项目数完全相同。数字是正确的。

我尝试过使用“e.getValueIsAdjusting()”作为第二个,但没有用。

这是完整的方法:

   public void cargarProductos(ArrayList<Producto> productos) {

        DefaultTableModel tm = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        String[] cabecera = {"ID", "Nombre", "Detalle", "Precio Unit.", "idP", "Proveedor"};
        tm.setColumnIdentifiers(cabecera);
        for (Producto p : productos) {
            Object[] row = {p.getId(), p.getNombre(), p.getTamaño(), p.getPrecioUnitario(), p.getProveedor().getId(), p.getProveedor().getNombre()};
            tm.addRow(row);
            tabProductos.setModel(tm);
            tabProductos.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                  int idProducto = (int) tabProductos.getValueAt(tabProductos.getSelectedRow(), 0);
                        System.out.println(idProducto);
                    }
                }
            });
            tabProductos.getColumn("ID").setMaxWidth(36);
            tabProductos.setAutoCreateRowSorter(true);
            tabProductos.getTableHeader().setReorderingAllowed(false);
        }
    }

谢谢

最佳答案

您将 MouseListener 多次添加到 for 循环的 JTable 内部 -- 坏消息,因为单击表时将触发多个监听器。解决方案是不要这样做。相反,创建 JTable,设置其模型,然后执行此操作后,将 MouseListener 添加到 JTable,但仅一次。

也许类似(代码未测试):

public void cargarProductos(ArrayList<Producto> productos) {

    DefaultTableModel tm = new DefaultTableModel() {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    };
    String[] cabecera = {"ID", "Nombre", "Detalle", "Precio Unit.", "idP", "Proveedor"};
    tm.setColumnIdentifiers(cabecera);
    for (Producto p : productos) {
        Object[] row = { p.getId(), p.getNombre(), p.getTamaño(), p.getPrecioUnitario(), 
                p.getProveedor().getId(), p.getProveedor().getNombre()};
        tm.addRow(row);
    }

    // do all of this **after** the for loop, not inside it
    tabProductos.setModel(tm);
    tabProductos.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2) {
                int idProducto = (int) tabProductos.getValueAt(tabProductos.getSelectedRow(), 0);
                System.out.println(idProducto);
            }
        }
    });
    tabProductos.getColumn("ID").setMaxWidth(36);
    tabProductos.setAutoCreateRowSorter(true);
    tabProductos.getTableHeader().setReorderingAllowed(false);
}

关于java - JTable 上的监听器出现问题(执行代码太多次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50548283/

相关文章:

java - 如何访问本地机器的temp目录

java - 为什么 GridBagLayout 不创建第三列?

java - 如何从 Java ResultSet 中确定列数?

java - 如何从 Java 应用程序将 JTable 数据发送到打印作业?

java - 在java中进行xml转换和过滤

java - 如何将项目转换为maven?

java - (JavaFX) 如何在构造函数和initialize()之间调用类的方法?

java - 修复 JFrame 中 JPanel 的 JScrollPane 的大小

java - 如果 GUI 是在构造函数中定义的,如何添加或删除 jtable?

java - 我如何选择并杀死多个应用程序