如何验证 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);
    }
}