在验证单元格时,JTable单元格编辑不会更改的原因是因为JTable的编辑器组件默认在编辑状态下不会触发验证。这是为了避免在用户输入过程中频繁触发验证,导致用户体验不佳。
要解决这个问题,可以通过以下步骤来实现验证单元格时JTable单元格编辑的更改:
下面是一个示例代码,演示如何实现验证单元格时JTable单元格编辑的更改:
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTableValidationExample extends JFrame {
private JTable table;
private DefaultTableModel tableModel;
public JTableValidationExample() {
setTitle("JTable Validation Example");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 创建表格模型
tableModel = new DefaultTableModel(new Object[][]{
{"1", "John Doe", "john@example.com"},
{"2", "Jane Smith", "jane@example.com"},
{"3", "Bob Johnson", "bob@example.com"}
}, new Object[]{"ID", "Name", "Email"});
// 创建表格
table = new JTable(tableModel);
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!isValidCell(row, column)) {
component.setBackground(Color.RED);
} else {
component.setBackground(table.getBackground());
}
return component;
}
});
// 设置编辑器
table.getColumnModel().getColumn(2).setCellEditor(new ValidatingCellEditor());
// 创建按钮
JButton validateButton = new JButton("Validate");
validateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
validateTable();
}
});
// 添加组件
add(new JScrollPane(table), BorderLayout.CENTER);
add(validateButton, BorderLayout.SOUTH);
pack();
setLocationRelativeTo(null);
}
private boolean isValidCell(int row, int column) {
// 根据自定义的验证规则判断单元格是否有效
String email = (String) table.getValueAt(row, column);
return email.contains("@");
}
private void validateTable() {
for (int row = 0; row < table.getRowCount(); row++) {
for (int column = 0; column < table.getColumnCount(); column++) {
if (!isValidCell(row, column)) {
table.getCellEditor(row, column).cancelCellEditing();
}
}
}
}
private class ValidatingCellEditor extends DefaultCellEditor {
public ValidatingCellEditor() {
super(new JTextField());
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
// 在选择单元格时触发验证
return true;
}
@Override
public boolean stopCellEditing() {
// 验证单元格的值是否有效
String value = (String) getCellEditorValue();
if (!value.contains("@")) {
JOptionPane.showMessageDialog(JTableValidationExample.this, "Invalid email address", "Error", JOptionPane.ERROR_MESSAGE);
return false;
}
return super.stopCellEditing();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JTableValidationExample().setVisible(true);
}
});
}
}
在上述示例中,我们创建了一个包含ID、Name和Email三列的JTable,并为Email列设置了自定义的TableCellEditor类ValidatingCellEditor。在ValidatingCellEditor中,我们重写了shouldSelectCell方法,在选择单元格时触发验证;重写了stopCellEditing方法,在停止编辑时进行验证。如果验证不通过,会弹出一个错误提示框。
这样,当用户编辑Email列时,只有输入的值符合验证规则(包含@符号)时,才能成功编辑。否则,编辑会被取消,并弹出错误提示框。
这个示例中没有提及具体的云计算品牌商,但你可以根据自己的需求选择适合的云计算服务提供商,例如腾讯云。腾讯云提供了丰富的云计算产品和解决方案,可以根据具体的业务需求选择相应的产品和服务。你可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于腾讯云的信息。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云