gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:09:25 25 4
gpt4 key购买 nike

我目前正在尝试在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com