我有一个JTable,我需要验证2列的输入。这是2个特定列需要在每个单元格中包含适当的值。如果他们这样做,那么我想启用一个按钮。我知道如何启用按钮,但我不知道在哪里/如何验证这两列。什么表模型方法是验证这些单元格并启用按钮的适当位置(如果有的话)?我想我需要一个监听器来处理这些单元并在lostFocus()中处理它们。唯一的问题是,如果用户将光标留在其中一个单元格中,那么即使条目有效,它也永远不会失去焦点。这必须是一种相对常见的做法,因此必须有最好的编程实践来完成它。 TIA。
答案 0 :(得分:2)
添加到表格模型中的TableModelListener会通知您模型数据的任何变化。在监听器中,您可以遍历行,使用getValueAt(...)方法提取列数据,然后相应地启用/禁用JButton或其Action。
例如,在以下代码中有两列整数。 B列中的int必须大于A列才能使数据有效。如果不是这种情况(或者如果任何值为null),则禁用该按钮:
import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
public class TableFun extends JPanel {
private Integer[][] DATA = {{1, 2}, {3, 4}, {5, 6}};
private String[] COL_NAMES = {"A", "B"};
private DefaultTableModel model = new DefaultTableModel(DATA, COL_NAMES) {
public java.lang.Class<?> getColumnClass(int columnIndex) {
return Integer.class;
};
};
private JTable table = new JTable(model);
private JButton myButton = new JButton("My Button");
public TableFun() {
model.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
boolean valid = true;
for (int row = 0; row < model.getRowCount(); row++) {
Integer valueA = (Integer) model.getValueAt(row, 0);
Integer valueB = (Integer) model.getValueAt(row, 1);
if (valueA == null || valueB == null || valueA.compareTo(valueB) > 0) {
valid = false;
}
}
myButton.setEnabled(valid);
}
});
JPanel panel = new JPanel();
panel.add(myButton);
setLayout(new BorderLayout());
add(new JScrollPane(table));
add(panel, BorderLayout.PAGE_END);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui() {
TableFun mainPanel = new TableFun();
JFrame frame = new JFrame("TableFun");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
}