首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

验证单元格时,JTable单元格编辑不会更改

在验证单元格时,JTable单元格编辑不会更改的原因是因为JTable的编辑器组件默认在编辑状态下不会触发验证。这是为了避免在用户输入过程中频繁触发验证,导致用户体验不佳。

要解决这个问题,可以通过以下步骤来实现验证单元格时JTable单元格编辑的更改:

  1. 创建一个自定义的TableCellEditor类,继承DefaultCellEditor,并重写shouldSelectCell方法。在该方法中,判断是否需要进行验证,如果需要则调用stopCellEditing方法。
  2. 在自定义的TableCellEditor类中,重写stopCellEditing方法。在该方法中,首先调用getCellEditorValue方法获取编辑器的值,然后进行验证。如果验证通过,则调用super.stopCellEditing方法,否则调用cancelCellEditing方法取消编辑。
  3. 在JTable中使用自定义的TableCellEditor类作为编辑器。可以通过调用JTable的getColumnModel方法获取TableColumnModel对象,然后调用该对象的getColumn方法获取指定列的TableColumn对象,最后调用该对象的setCellEditor方法设置编辑器。

下面是一个示例代码,演示如何实现验证单元格时JTable单元格编辑的更改:

代码语言:txt
复制
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/)了解更多关于腾讯云的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券