JTable 上的侦听器问题(执行代码太多次)
Issue with Listener on a JTable (executes code too many times)
我目前正尝试在我的 Jtable 上使用侦听器,但事实证明,table 上的每个项目都会调用一次事件,这使得它非常慢。
这是我正在使用的代码:
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" 的打印次数恰好与 table 上的项目一样多。号码正确。
我试过 "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 循环的 inside 中 -- 坏消息,因为会触发多个侦听器单击 table 时。解决方案是不要这样做。而是创建您的 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);
}
我目前正尝试在我的 Jtable 上使用侦听器,但事实证明,table 上的每个项目都会调用一次事件,这使得它非常慢。 这是我正在使用的代码:
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" 的打印次数恰好与 table 上的项目一样多。号码正确。
我试过 "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 循环的 inside 中 -- 坏消息,因为会触发多个侦听器单击 table 时。解决方案是不要这样做。而是创建您的 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);
}