如何验证 JTable 中的必填字段
How to Verify Required Fields in JTable
我有一个 JTable,我需要验证 2 列的输入。即 2 个特定列需要在每个单元格中包含正确的值。如果他们这样做,那么我想启用一个按钮。我知道如何启用按钮,但我不知道 where/how 来验证这两列。哪种 table 模型方法是验证这些单元格并启用按钮(如果有)的合适位置?我在想我需要为这些单元格设置一个侦听器并在 loseFocus() 中处理它们。唯一的问题是,如果用户将光标留在其中一个单元格中,那么即使输入有效,它也永远不会失去焦点。这一定是一个相对普遍的做法,因此必须有一个最佳的编程实践来完成它。 TIA.
添加到 table 模型的 TableModelListener 将通知您模型数据的任何更改。在侦听器中,您可以遍历行,使用 getValueAt(...) 方法提取列数据,然后 enable/disable 您的 JButton 或其相应的 Action。
例如,在下面的代码中有两列整数。 B 列中的整数必须大于 A 列中的数据才能有效。如果不是这种情况(或者任何值为空),则禁用该按钮:
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);
}
}
我有一个 JTable,我需要验证 2 列的输入。即 2 个特定列需要在每个单元格中包含正确的值。如果他们这样做,那么我想启用一个按钮。我知道如何启用按钮,但我不知道 where/how 来验证这两列。哪种 table 模型方法是验证这些单元格并启用按钮(如果有)的合适位置?我在想我需要为这些单元格设置一个侦听器并在 loseFocus() 中处理它们。唯一的问题是,如果用户将光标留在其中一个单元格中,那么即使输入有效,它也永远不会失去焦点。这一定是一个相对普遍的做法,因此必须有一个最佳的编程实践来完成它。 TIA.
添加到 table 模型的 TableModelListener 将通知您模型数据的任何更改。在侦听器中,您可以遍历行,使用 getValueAt(...) 方法提取列数据,然后 enable/disable 您的 JButton 或其相应的 Action。
例如,在下面的代码中有两列整数。 B 列中的整数必须大于 A 列中的数据才能有效。如果不是这种情况(或者任何值为空),则禁用该按钮:
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);
}
}