如何验证JTable中的必填字段

时间:2018-02-22 17:26:31

标签: java swing jtable verify

我有一个JTable,我需要验证2列的输入。这是2个特定列需要在每个单元格中包含适当的值。如果他们这样做,那么我想启用一个按钮。我知道如何启用按钮,但我不知道在哪里/如何验证这两列。什么表模型方法是验证这些单元格并启用按钮的适当位置(如果有的话)?我想我需要一个监听器来处理这些单元并在lostFocus()中处理它们。唯一的问题是,如果用户将光标留在其中一个单元格中,那么即使条目有效,它也永远不会失去焦点。这必须是一种相对常见的做法,因此必须有最好的编程实践来完成它。 TIA。

1 个答案:

答案 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);
    }
}