Как проверить обязательные поля в JTable

У меня есть JTable, и мне нужно проверить ввод 2 столбцов. То есть 2 конкретных столбца должны содержать правильные значения в каждой ячейке. Если они это сделают, я хочу включить кнопку. Я знаю, как включить кнопку, но я не знаю, где и как проверить эти 2 столбца. Какой метод табличной модели будет подходящим местом для проверки этих ячеек и включения кнопки, если таковая имеется? Я думаю, что мне нужен слушатель для этих ячеек и обработать их в lostFocus(). Единственная проблема заключается в том, что пользователь оставляет курсор в одной из этих ячеек, чтобы он никогда не терял фокус, даже если запись действительна. Это должно быть относительно распространенной практикой, поэтому для ее достижения должна быть лучшая практика программирования. ТИА.

1 ответ

Решение

TableModelListener, добавленный в модель таблицы, будет уведомлять вас о любых изменениях данных модели. В слушателе вы можете выполнять итерацию по строкам, извлекая данные столбца с помощью метода getValueAt (...), а затем, соответственно, включать / отключать ваш JButton или его действие.

Например, в следующем коде есть два столбца целых чисел. Значения в столбце 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);
    }
}
Другие вопросы по тегам