首页
学习
活动
专区
工具
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/)了解更多关于腾讯云的信息。

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

相关·内容

JTable怎样控制某一列、某一单元格允许或不允许被编辑

网上有很多关于怎样实现JTable不能被编辑的文章,因为如果不设置的话,双击单元格就会将单元格的内容读入一个默认的编辑器里,很多时候我们并不希望这样的事情发生,所以必须do something来阻止它。...呵呵,好吧,我承认大家都知道下面这种方法可以实现让整个表格不不允许被编辑 DefaultTableModel newTableModel = new DefaultTableModel(dataVector...其实仔细观察一下,这个isCellEditable方法会传两个参数进来,明眼人一看就知道,这分别是单元格的行和列索引,所以,根据这个row和column来控制返回true或false,我们的愿望就能实现了...下面是几个例子,要学会举一反三噢: 1、只允许表格的第三列被编辑 public boolean isCellEditable(int row,int column){ if(column ==...3){ return true; }else{ return false; } } 2、只允许表格的第二行、第二列的单元格编辑 public boolean

1.2K10

Java Swing JTable

1 简介 JTable用于显示和编辑常规的二维单元格表。有关面向任务的文档和使用JTable的示例,请参见Java教程中的如何使用表。...使用专门的渲染器和编辑器。 JTable仅使用整数来引用它显示的模型的行和列。 JTable只是采用表格形式的单元格范围,并在绘制过程中使用getValueAt(int,int)从模型中检索值。...JTable 使用此方法来设置列的默认渲染器和编辑器。...*/ public Class getColumnClass(int columnIndex); 判断指定单元格是否可编辑 如果行和列中的单元格是可编辑的,则返回true。...这是一个重要的区别,因为当用户重新排列表中的列,视图中给定索引处的列将发生变化。同时,用户的操作永远不会影响模型的列顺序。 ?

5K10
  • java winform开发之JTable全攻略

    这两天在研究JTable的使用,也有一些收获,所以在这里跟大家分享交流一下,下面的内容将包括:1)JTable的基本用法;2)怎样为JTable添加行点击响应事件,双击后打开窗口;3)怎样为JTable...java winform开发,所以界面怎么快就怎么做了,我直接在窗体的“设计”模式下直接拖“表格”出来就了事,在默认的情况下,这个表格还会有几行几列的填充内容的,如果需要编辑,可以先点击表格进入它的编辑状态...,然后右击,选择“表内容”就可以进行表格的行和列的编辑了,不过通常情况下,表格的内容都是动态生成的,所以在控件上直接编辑它的内容的意义是不大的,当然,做DEMO比较有用。...添加行标识 我们知道,JTable的每一个单元格,要求的值类型是一个Object的实例,也就是说,只要是一个对象就可以了,这个机制,给了我们非常大的发挥空间,我们可以在一个单元格中存放任意类型的对象,...只要在这个对象中重写一下toString()方法,将我们希望在单元格中显示的内容return出来就可以了,只JTable本身,并没有提供设置行id等识别表格行对象的方法,所以我想到了自己定义一个单元格对象

    1.2K30

    java swing 添加 jcheckbox复选框

    而一般情况使用JTable(Vector rowData,Vector columnNames)       在Java方法中,如果参数需要传递接口,可以在调用方法传递一个(匿名)对象,该对象是一个不具名的类的实例...其次是表格样式,表格将数据和如何显示数据(比如列数量、列名称、是否可编辑)保存在其数据模版中,该模版实现自接口TableModel。   最后,表格(每一个单元格)可以设置渲染效果。...48 48 * 可以通过row和column索引判断某一个单元格是否可编辑 49 49 * 此处设为都不可编辑 50 50...,然后设置单元格渲染 87 85 // 设置列编辑器 88 86 // 在以复选框为对象设置列编辑,必须保证该列能够被编辑,否则无法更改状态 89 87...// (此步骤可以省略,省略不要忘记将列设为不可编辑) 90 88 // table.getColumnModel().getColumn(1).setCellEditor

    3.3K00

    java swing项目桌面软件还是蛮香的,至少有了我自己的桌面软件|Java 开发实战

    我需要一个几行几列的表格,至于每个单元格显示的内容就是通过getValueAt这个方法实现的,到这里我们就实现了,jtable的model自定义显示。...$BooleanRenderer"); }源码中就有渲染器专门处理bool类型的,那么我们只需要在getColumnClass进行处理就行了,在我们的bool的单元格返回bool类JTable就会采用...渲染和编辑这种呢其实就是上面的getClass底层的实现方式,JTable中源码我们上面可以看出JTable通过返回的不同的类来调用不同的渲染器,现在我们不通过返回类的方式来渲染,而是自己定义一个渲染器...,然后通过JTable提供的方法设定用该渲染器渲染该单元格!...设置完了编辑器,我们最终要是只渲染器,就是JTable最终如何显示的问题。和上面的那个一样。

    33710

    VsCode中使用Jupyter

    当不信任笔记本,VS Code将不会渲染Markdown单元或在笔记本中显示代码单元的输出。相反,将仅显示Markdown和代码单元的来源。...笔记本基本上处于只读模式,禁用了工具栏,除非将其设置为Trusted,否则无法编辑文件。 注意:在将Notebook设置为Trusted之前,您需要验证源代码和Markdown是否可以安全运行。...如果不这样做,则在选择PDF选项将提示您安装它。另外,请注意,如果您的Notebook中只有SVG输出,它们将不会显示在PDF中。...您还可以使用鼠标来更改模式,方法是单击单元格左侧或代码单元格中的代码/降价区域之外的垂直栏。 ---- 要从编辑模式切换到命令模式,请按ESC键。要从命令模式切换到编辑模式,请按Enter键。...注意如果不是命令模式就摁Esc 撤消您的最后更改# 您可以使用z键撤消之前的更改,例如,如果您进行了意外编辑,则可以将其撤消到先前的正确状态,或者如果您意外删除了单元格,则可以将其恢复。

    6K40

    表格控件:计算引擎、报表、集算表

    主要更新亮点 工作薄增强 居右对齐 将样式的 textDirection 属性设置为 rightToLeft,可以将单元格中的文本方向更改为从右到左。...启用后,当隐藏单元格处于活动状态编辑栏将不会显示任何数据,输入编辑器在编辑模式下将为空,并且公式编辑器面板将不会显示公式。 利用这个特性,可以保护一些单元格中的公式,避免使用者看到公式或修改。...邮件 文本 以掩码验证指示电子邮件地址 链接 文本 指示 URL 文本 创建时间 日期 在创建记录设置日期 修改时间 日期 在记录字段更新设置日期 附件 对象 允许直接在记录上附加文件 条码 取决于输入...从字段生成指定的条形码 撤销重做支持 新版本集算表添加了撤消和重做支持,允许用户撤消/重做以下类别的操作: 配置更改:过滤、排序和其他配置设置 运行时 UI 操作:类似于工作表操作,如单元格编辑、添加.../删除行/列、剪贴板操作、拖动/移动行/列等 集算表 API:大多数更改数据或设置的 API 操作(setDataView 方法除外) 同样,在表格编辑器中也支持撤销重做。

    11910

    【C#】让DataGridView输入中实时更新数据源中的计算列

    需求是对A列进行编辑(输入或删除),B列能实时变化。例如下面的例子: ? 【目标文件名】是根据【款号】和【色号】计算而来(连接字符串),当编辑款号/色号,目标文件名能实时变化。...原因是dgv默认是等焦点离开编辑单元格(CurrentCell),才会提交更改到数据源,而且就算焦点离开,但如果焦点仍在同一行(即CurrentCell改变,但CurrentRow没变)的话,该行的源行也仍然处在编辑状态...(DataRowView.IsEdit为true),计算列也同样不会更新。...,比如单元格数据验证,但这里只说与提交直接相关的环节)。...CurrentCellDirtyStateChanged事件达到目的: private void dgv_CurrentCellDirtyStateChanged(object sender, EventArgs e) { //判断当前单元格是否存在未提交的更改

    5.2K20

    C#——DataGridView控件填写数据事件

    private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) { } // 当单元格进入编辑状态发生...private void dataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { } // 在单元格的状态相对于其内容的更改更改时发生...private void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e) { } // 在单元格完成编辑发生...举个例子,我单击一个单元格,则单元格进入编辑状态,CellBeginEdit事件发生,然后我输入1,2……乃至更多的东西,上述的事件也不会发生。另外Key*系列的事件也试过,也没反应。...EditingControlShowing事件比上述事件还要早发生,他是dataGridView控件为了使用户可以编辑,而加载一个TextBox(如果单元格复选框,是其他的控件,那么就加载对应的控件)

    1.6K62

    Excel实战技巧108:动态重置关联的下拉列表

    在相互关联的数据验证(即“数据有效性”)列表中常见的问题是:当更改第一个数据验证的值,与其相关联的数据验证的值会一直保留,直到你激活其下拉列表。这可能会产生误导。...注意,默认的工作表事件过程是SelectionChange事件,每次更改活动单元格都会触发该事件。...在这种情况下,最好使用工作表对象的Change事件并确保它仅在特定单元格的值发生更改时运行,而不是每次更改任何单元格都触发该事件过程。...图1 然而,当我们改变单元格C2中的分类选择单元格C6中显示的内容并不会作出相应的改变(如下图2所示),你必须将光标移到单元格C6中重新进行选择。...End If End Sub 至此,当更改单元格C2中的选择项单元格C6中的内容将更新为“请选择…”,如下图4所示。 图4

    4.6K20

    《Python for Excel》读书笔记连载4:Python开发环境之Jupyter笔记本

    在本例中,它在下面插入一个空单元格,因为到目前为止我们只有一个单元格。更详细一点:当一个单元格在计算,它显示在[*]中,当它完成,星号变成一个数字,例如在[1]中。...要将单元格类型更改为Markdown,选择该单元格,然后在“单元格模式”下拉列表中选择Markdown(见图2-3)。在后面的表中会为你显示一个更改单元格模式的键盘快捷键。...Markdown单元格还允许包含图像、视频或公式。 图2-4:运行一个代码单元格和一个Markdown单元格后的笔记本 编辑 VS....命令模式 当你与Jupyter笔记本中的单元格交互,你就处于编辑模式(editmode)或命令模式(commandmode): 编辑模式 单击单元格可启动编辑模式:选定的单元格周围的边框变为绿色,单元格中的光标闪烁...选择单元格,也可以按Enter键,而不是单击单元格。 命令模式 要切换到命令模式,按退出键(ESC);选定的单元格周围的边框将为蓝色,并且不会有任何闪烁的光标。

    2.7K30

    Spread for Windows Forms快速入门(15)---使用 Spread 设计器

    用户可以使用对象列表选中指定的对象,也可以通过点击表单、单元格行、单元格列、单元格来选中指定的对象,接下来就可以在属性窗口中编辑选中对象的属性了。...为了帮助用户更好的使用 Spread 设计器,在设计模式下 Spread 设计器并不会应用一些属性。...下面的属性列表都是这类属性,为了能够更好的辅助用户设计,在设计模式下这些属性不会生效。...点击并编辑这两个属性,将其更改为10。 4. 在单元格行和列的头区域添加有意义的文字。通过点击单元格行的头区域,将该单元格行选中。右键点击该行,在弹出菜单中选择“页眉”。...接下来,继续在属性窗口中改变单元格列的背景色为黄色,点击“应用”,然后点击“确认“关闭编辑窗口。再次右键点击当前单元格列的头区域,在编辑窗口中将列高更改为 75,点击“应用”。

    2K90

    Excel事件(二)工作表事件

    示例一 更改单元格的数据后,弹窗显示更改单元格地址。(注意事件的代码不需要去运行)。...用户修改单元格内容,触发一次change事件,中间代码也修改单元格内容中加入了“内容已更改”,这也会再一次触发了change事件,第二次在单元格值前加入”内容已更改“标识,循环触发下去。)...所以用户修改单元格的内容,先触发了代码运行后。要先禁止事件。让中间的代码去添加“内容已更改”标识。此时因为禁止事件而不会触发,修改完之后再恢复事件开启即可。...再更改别的单元格,颜色也会跟着更改。 大家可以尝试下让选中的单元格所在的行和列都标注颜色。 五、activate事件 工作表事件,图表工作表或嵌入式图表触发activate激活事件。...Private Sub Worksheet_Deactivate() MsgBox "不允许编辑汇总表之外的其他工作表" Worksheets("汇总表").Select End Sub 当选中其他工作表

    3.6K10

    Excel实战技巧111:自动更新的级联组合框

    如何克服级联数据验证列表的问题,即一旦第一个列表的值发生更改,其关联的列表就不会自动重置——你将学习一种替代方法来克服自动重置失败的问题(一旦第一个列表的值发生变化,将自动刷新关联的列表) 通过使用组合框表单控件...与传统的数据验证(即“数据有效性”)下拉列表相比,组合框表单控件具有许多优点。 下拉指示器在组合框中始终可见;而在数据验证中,用户必须单击单元格来显示下拉指示器。...图5 从图5中可以看到,组合框的选择与单元格K4链接,当我们选择组合框中的下拉列表项,将会在该单元格中放置所选项在列表中的位置值。 下面,我们来创建级联的组合框。...图9 设置第二个组合框的源数据区域为N4:N18,单元格链接到M4以存储代表所选项位置的数字。 此时,你可以试试,当你在第一个组合框中选择,第二个组合框中的列表项也随之发生更改。...注意到,当我们选择不同部门,由于其对应的App列表长度不同,列表底部会存在空,如下图12所示。 图12 在此,我们通过定义名称来解决。

    8.4K20

    Excel小技巧79:如何跟踪Excel工作簿的修改

    你可以手动查看删除或添加了哪些数据,但你必须自己对电子表格进行更改。 2. 启用跟踪并不意味着你所做的每一个更改都会被记录下来。存储在单元格中的任何数据都会被跟踪,但格式等其他更改不会被跟踪。...此时,需要选取“编辑跟踪修订信息,同时共享工作簿”复选框。 ? 图2 这里有几个选项,包括时间、修订人和位置。对于“时间”,“全部”意味着每一个变化都将被突出显示。...如果取消选中“在屏幕上突出显示修订”选项,则不会显示黑色小三角形。 ?...最后,你可以选择如何处理冲突:要么被询问,要么干脆优先给保存文件的最后更改。...值得注意的是,如果另一个单元格引用了被拒绝的单元格的内容,那么当引用的单元格值恢复,其值也会更改,这可能导致公式中断等,因此要小心。

    6.4K30

    Excel编程周末速成班第21课:一个用户窗体示例

    步骤5:编写数据验证代码 当用户单击“下一步”或“完成”按钮验证代码将检查数据。需要检查的具体项目为: 名字、姓氏、地址和城市字段不能为空。 选择州。 邮政编码字段包含五个字符。...你可以看到,当用户单击“下一步”或“完成”按钮,将执行验证。因此,不应将验证代码放在按钮的Click事件过程中,而应放在它自己的过程中。...按照以下步骤创建验证过程: 1.显示用户窗体的代码编辑窗口。 2.选择插入➪过程,打开“添加过程”对话框。 3.输入ValidateData作为过程名称;在类型下选择“函数”。 4.单击确定。...ValidateData = True Then        EnterDataInWorksheet        ClearForm     End If End Sub 步骤7:测试该工程 你可以通过在VBA编辑器中打开用户窗体按...数据验证是任何数据输入程序的重要组成部分。 可以在输入数据之后或输入数据执行数据验证。 当你的代码将在程序的多个位置中使用时,将其放在单独的过程中。

    6.1K10

    Excel实战技巧105:转置数据的3种方法

    图2 选择数据单元格区域A3:B7,按下Ctrl+C组合键或者单击“复制”按钮。 选择要粘贴数据的单元格区域左上角单元格,单击鼠标右键,从快捷菜单中选择“选择性粘贴——转置”命令,如下图3所示。...如果源数据发生更改,已转置过的数据不会作出相应的更改。 方法2:使用TRANSPOSE函数 选择单元格D3,输入公式: =TRANSPOSE(A3:B7) 如下图5所示。 ?...图6 之所以会出现这样的情况,是因为试图在单个单元格中显示所有数据。如果我们编辑TRANSPOSE函数公式,按F9键,会看到公式的结果为一组数据。 ?...图8 因为使用的是公式,所以当原数据区域中的值更改时,公式区域的值也会相应更改。 方法3:简单的单元格引用 首先,利用填充序列功能,在要放置转置数据的单元格区域输入如下图9所示的数据。 ?...图11 使用此方法,当原数据区域中的值更改时,数据转置区域的值也会相应更改

    4.4K31
    领券