当前位置: 首页 > 面试题库 >

JTable无需用户单击即可停止单元格编辑

终逸仙
2023-03-14
问题内容

我正在尝试用我的程序解决一个奇怪的问题。该程序创建了一系列GUI和JTable,使用户能够生成XML文件。这些表之一是用于创建“语句”的。除了要说的是数据存储在多个2D数组中,这些2D数组又存储在哈希映射中之外,我将不做详细介绍。

这是发生了什么。当用户进入Statement屏幕时,将使用2D数组中的内容生成JTable。此数据填充用户能够修改的单元格。这些单元格之一(也是最重要的)是数量。他们为行设置的数量与另一个类的其他数量非常匹配。

表格底部是一个“完成”按钮。当用户单击此按钮时,逻辑将检查金额是否匹配。如果这样做,则程序将使用任何更改的值更新2D数组并处理JTable。

我的问题是,一旦用户更新了单元格并单击“完成”,最后所做的更新将不起作用。本质上,用户必须首先单击表中的其他位置,然后点击完成。我希望此操作自动发生,以便当用户单击“完成”的单元格时停止编辑。这是完成按钮的代码:

finishedButton.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent ae){

                //Creates another table model for the finished button logic. 
                DefaultTableModel dm = (DefaultTableModel)StatementGUI.tbl.getModel();

                //Gets the total number of table rows. 
                int rows = dm.getRowCount();

                //Creates a variable to store the statement transaction total. 
                double statementTransactionTotal=0;

                //For each row in the table. 
                for(int i = 0; i < dm.getRowCount(); i++){

                    //Gets the total of all transactions in the table. 
                    String currentTotal = tbl.getValueAt(i, 3).toString();
                    Double currentTotalDouble = Double.parseDouble(currentTotal);
                    statementTransactionTotal=statementTransactionTotal+currentTotalDouble;

                }

                //Creates a decimal format and applies the statement total. 
                DecimalFormat df = new DecimalFormat("0.00");
                String currentTotalDF = df.format(statementTransactionTotal);

                //Stops editing on the table so that the data can be used. 
                if(null != tbl.getCellEditor()){
                    tbl.getCellEditor().stopCellEditing();
                }

                //If the statement total matches the transaction total..
                if(currentTotalDF.matches(ClearedMainGUI.currentTransactionAmount)){

                    //For each row in the table..
                    for(int i = 0; i < dm.getRowCount(); i++){

                    //Will replace the hash/array value with the table value. 
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][0]=tbl.getValueAt(i, 0).toString();
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][1]=tbl.getValueAt(i, 1).toString();
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][2]=tbl.getValueAt(i, 2).toString();
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][3]=tbl.getValueAt(i, 3).toString();
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][4]=tbl.getValueAt(i, 4).toString();
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][5]=tbl.getValueAt(i, 5).toString();
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][6]=tbl.getValueAt(i, 6).toString();
                    ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][7]=tbl.getValueAt(i, 7).toString();

                    }


                    //For each row in the table..
                    for(int i = rows - 1; i >=0; i--){

                        //Removes the current row so the table will be empty next time. 
                        dm.removeRow(i);

                    }

                    //Removes the frame and goes back to the previous GUI. 
                    frame.dispose();

                //If the statement total and transaction total do not match..
                }else{

                    JOptionPane.showMessageDialog(null, "The statement total entered: $"+statementTransactionTotal+" " +
                            "does not match the transaction total of: $"+ClearedMainGUI.currentTransactionAmount);

                }



            }

        });

我认为我的问题在于这条线:

if(null != tbl.getCellEditor()){
                    tbl.getCellEditor().stopCellEditing();
                }

仅当用户在编辑单元格后单击表的另一个区域时,这才似乎起作用。

感谢您的帮助!


问题答案:

我的问题是,一旦用户更新了单元格并单击“完成”,最后所做的更新将不起作用。

查看表停止编辑的两种方法:

您可以:

将代码添加到ActionListener:

if (table.isEditing())
     table.getCellEditor().stopCellEditing();

或在表格上设置属性:

JTable table = new JTable(...);
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

编辑:

当用户单击完成时,所有单元格数据将保存到2D阵列中。

为什么?所有数据已存储在TableModel中。

无论如何,在尝试将数据从TableModel复制到Array之前,都需要停止编辑。



 类似资料:
  • 我想要一个有4列的jtable。一列必须是组合框。其他列是字符串。 只要找到问题:在注释语句jcb.seteditable(true)时;,如果我在comboxcell上单击一次,它就会打开这个单元格。但我不知道为什么效果更好。此外,我希望combox可编辑。 我怎么能对其他细胞有同样的行为。 再次您好,我已经更新了代码,以便使-如果我通过重写方法在单元格上单击一次,单元格可以编辑-如果我通过重写

  • 问题内容: 我需要在jTable中显示数字,精确到小数点后两位。为此,我创建了一个自定义单元格编辑器,如下所示: 该单元格编辑器非常适合将点用作小数点的英语语言环境。但是在德语语言环境中,它不接受逗号作为小数点的值。请让我知道我的代码中有问题的地方。提前致谢。 编辑:这是我如何使其工作: 问题答案: 使用语言环境来发挥您的优势:

  • 我有这个JTable,我有一个Jextfield,它们都在2个不同的jPanels中。我希望用户能够单击jtable中的某个单元格,并从选定的行中获取该单元格的值到jextfield中,但在第一列中,无论用户按下了什么其他列。当我单击jtable时出现错误时,我不明白为什么...建议? 提前谢谢^_^ 完整错误堆栈跟踪:线程“AWT-EventQueue-0”java中出现异常。lang.Arra

  • 在我的程序中,有一个带有许多加速器的JMenu和一个可编辑的JTable。问题是,当编辑JTable时,加速器键仍然会被触发。 编辑上表中的任何单元格,有一个菜单项设置为哔哔声与加速器'n'。

  • 问题内容: 有什么办法可以在jtable中动态制作不可编辑的单元格吗?每当用户提供类似false的输入时,我都想创建不可编辑的单元格…我已经在DefaultTableModel isCellEditable方法中看到过,但是如果我想使用它,则每次创建新对象时都会创建它,因此我想动态更改它为不可编辑。有人可以帮我吗?。谢谢 问题答案: 其他班级 然后,您可以通过使用存储的myModel变量并在其上调

  • 问题内容: 你们真是太棒了,为我在最后一个问题上指明了正确的方向,我在这里对我原来的问题进行了扩展: 如何将JTable列设置为String并排序为Double? 由于现在我使用自定义单元格渲染器将价格列的格式设置为$ ###,## 0.00,因此我现在还为该单元格设置了JTextField编辑器。单元格的编辑工作正常,除了更新值时,自定义渲染器中设置的数字格式似乎不再格式化单元格(在提交编辑后,