Как проверить обязательные поля в 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);
}
}