当前位置: 首页 > 知识库问答 >
问题:

无法从JTable更新单元格

马泰
2023-03-14

我一直在试图找到一种通过直接输入来更新我的细胞的方法。从我的研究来看,每个人似乎都说你必须使用

myJTable.fireTableCellUpdated()

尽管如此,它还是让我投myJTable--

以下是我当前的表代码,如果这有帮助的话:

    myJTable= new JTable();

    myJTable.setModel(new DefaultTableModel(
        new Object[][] {
            {null, null, null},
        },
        new String[] {
            "Thing#1", "Thing#2", "Thing#3"
        }
    ));

    myJTable.getModel().addTableModelListener(new TableModelListener() { 
         public void tableChanged(TableModelEvent e) { 
             myJTable.fireTableCellUpdated(e.getFirstRow(), e.getColumn());
             myJTable.repaint(tblCG.getCellRect(e.getFirstRow(), e.getColumn(), false));
             myJTable.putClientProperty("terminatedEditOnFocusLost", true);
         } 
         });

我怎么可能从用户直接输入更新的单元格中保存数据?谢谢!

共有2个答案

广绪
2023-03-14

以下是我的建议(希望我能正确理解问题):

>

  • 我将把传递给DefaultListModel的数据字段声明为类属性。然后可以通过这些属性访问表中的对象。

    我将重写隐式构造函数中的DefaultTableModel#setValueAt(Object,int,int)DefaultTableModel#getValueAt(int,int)

    因此,请尝试以下解决方案:

    //declared as class attributes
    Object[][] data = {{null, null, null},};
    String[] columns = {"Thing#1", "Thing#2", "Thing#3"};
    
    /*...*/
    
    table.setModel(new DefaultTableModel(data, columns) {
        @Override
        public Object getValueAt(int row, int col) { return data[row][col]; }
        @Override
        public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }
    }); 
    

    希望这能帮助。。。

  • 盖向荣
    2023-03-14

    根据您尝试做的事情,您可以使用...

    • JTable#setValueAt(Object,int,int)TableModel#setValueAt(Object,int,int)修改现有单元格的行/列值。请注意,模型和视图可能基于当前排序顺序和列位置具有不同的索引

    例如

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.table.DefaultTableModel;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        private JTable myJTable;
    
        private String values[] = {"Orange", "Green", "Blue", "Pink", "Yellow"};
        private int count;
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    myJTable = new JTable();
    
                    myJTable.setModel(new DefaultTableModel(
                                    new Object[][]{{"Banana", "Yellow"}},
                                    new Object[]{"Fruit", "Color"}
                    ));
    
                    JButton change = new JButton("Change");
                    change.addActionListener(new ActionListener() {
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            count++;
                            String value = values[Math.abs(count % values.length)];
                            myJTable.setValueAt(value, 0, 1);
                        }
    
                    });
                    JButton add = new JButton("add");
                    add.addActionListener(new ActionListener() {
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            DefaultTableModel model = (DefaultTableModel) myJTable.getModel();
                            model.addRow(new Object[]{"Apple " + model.getRowCount(), "Green"});
                        }
    
                    });
                    JButton delete = new JButton("delete");
                    delete.addActionListener(new ActionListener() {
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            int rowIndex = myJTable.getSelectedRow();
                            rowIndex = myJTable.convertRowIndexToModel(rowIndex);
                            if (rowIndex > 0) {
                                DefaultTableModel model = (DefaultTableModel) myJTable.getModel();
                                model.removeRow(rowIndex);
                            }
                        }
    
                    });
    
                    JPanel actions = new JPanel();
                    actions.add(change);
                    actions.add(add);
                    actions.add(delete);
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new JScrollPane(myJTable));
                    frame.add(actions, BorderLayout.SOUTH);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
    }
    

    如果您自己以某种方式自定义了类,并且应该只从类上下文中调用,那么您只需要调用一个helperfireXxx事件方法,它们不应该在外部触发,实现类有责任这样做

    所以,没有其他代码。。。

    默认情况下内置单元格编辑。。。

    看...

    • 如何使用表格

    欲了解更多详情...

     类似资料:
    • 我有一个问题,我无法解决单独和帮助其他话题在那里。找到了一些相似的,但它没有帮助。 我的问题有点棘手,我想,我会尽力解释清楚。 因此,我得到了一个包含两列的JTable,列2和列3是可编辑的,列4是这两个列的乘积(col4=col2*col3)。我要做的是,当我编辑第2或第3列时,第4列将自动更新它的值。我理解这一点,但不完全理解。只有当我完成MouseClick编辑时单元格才会更新。如果编辑是通

    • 我在更新JTable的单元格值时遇到了一个问题。我想做的是在从JTable中选择一个特定的单元格之后,我应该能够进行编辑,并且该操作必须反映后端的数据库。我在用HSQL。我的表有4列,有一个PK。请给我一个替代和/或提供一些代码,替换的*。我是新来的,只是个初学者。

    • 我有一个jtable保存账本文件记录并将它们发送出去。

    • 问题内容: 我正在使用此处找到的自定义表格模型。我已经使用该帖子中提供的建议更新了我的代码,并遇到了一个新问题。我对我的代码所做的改变是一个注入到我,以避免与线程的问题。完成此操作后,通过按按钮更新我的表的代码已停止工作。 用于初始化的代码如下: 我用来更新的代码如下: 我也尝试过使用,但这也不起作用。截至目前,更新的唯一方法是关闭并重新打开程序。具有我正在使用的,随着用户添加更多玩家,尺寸会增加

    • 问题内容: 我想制作一个可编辑的表,然后检查数据以确保其有效。我不确定如何仅更改一个单元格的颜色。我想要一个单元格,例如(0,0)并将前景颜色设置为红色。我已经阅读了SO和Oracle上有关自定义ColorRenderer的其他文章,但是我不知道如何使用它。 谢谢。 问题答案: 假设您要用其他颜色渲染的单元格代表一种状态(我将以“拒绝并批准”为例)。然后,我将在我的表模型中实现一个名为getSta