JTable上的Listener问题(执行代码的次数太多)

时间:2018-05-27 01:22:32

标签: java swing jtable mouseevent listener

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

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);
        }
    }

由于

1 个答案:

答案 0 :(得分:2)

您将多次将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);
}