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

使用DefaultTableModel时刷新JTable中的数据

法风畔
2023-03-14

>

  • 我创建了一个函数inittable(),在该函数中我创建了表

    我创建了另一个函数initDatainTotable(),它将我的数据从arraylist发布到我的表中。

    到现在为止一切都很好。当我试图更新我的JTable时,问题就出现了。实际上,我打开一个jdialog并尝试在列表中添加一个新项。我开始使用新项修改ArrayList,但之后无法更新表,例如,我真的不知道将FireTableDatachanged()放在哪里,以及如何在需要时调用它。

    protected void initDataIntoTable() {
        tablemodel.setRowCount(0);
    
        for (//every item on my list) {
        String[] row = {dataitem, dataitem2};
            tablemodel.addRow(row);
        }
    
        TableModelListener myjtable_listener = new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
                                // I have to write something here to update my table ?
                                // I don't know if it's here where I have to update my table and if it is, how should I call this listener from the place I want to update ?
                tablemodel.fireTableDataChanged(); // ?
            }
        };
        table.getModel().addTableModelListener(jtable_listener);
        //tablemodel.addTableModelListener(myjtable_listener);
        }
    }
    
    class OKButton implements ActionListener {
         public void actionPerformed(ActionEvent e) {
        // Here I manage to get my updated list of objects
                // What should I call here to update my jtable ?    
        }
    }                   
    okbutton.addActionListener(new OKButton());
    

    我已经在这个网站上看到了一些问题,但我尝试的没有一个真正适用于我的程序。谢谢你的帮助,对不起我的英语。

  • 共有1个答案

    唐炜
    2023-03-14

    您不必显式调用FireTableDataChanged方法,因为当数据发生更改时(插入/更新/删除)由TableModel实现通知视图。

    在您的例子中,调用tablemodel.addrow(...)就足够了:表模型将通知视图数据已经更改,最后一个数据将被更新。

    okButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            ...
            ((DefaultTableModel)table.getModel()).addRow(...);
            ...
        }
    };
    

    您在评论中声明

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Window;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.util.Date;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;
    
    public class Demo {
    
        private void createAndShowGUI() {
    
            DefaultTableModel model = new DefaultTableModel(new Object[]{"TimeStamp", "Value"}, 0) {
                @Override
                public Class<?> getColumnClass(int columnIndex) {
                    switch(columnIndex) {
                        case 0: return Date.class;
                        default:  return super.getColumnClass(columnIndex);
                    }
                }
            };
    
            final JTable table = new JTable(model);
    
            JButton button = new JButton("Add entry...");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    new InputDialog((DefaultTableModel)table.getModel()).createAndShowGUI();
                }
            });
    
            JFrame frame = new JFrame("Demo");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.add(new JScrollPane(table), BorderLayout.CENTER);
            frame.add(button, BorderLayout.SOUTH);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        class InputDialog {
    
            private final DefaultTableModel model;
    
            public InputDialog(DefaultTableModel model) {
                this.model = model;
            }
    
            public void createAndShowGUI() {
    
                final JTextField textField = new JTextField(10);
                textField.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        model.addRow(new Object[]{new Date(), textField.getText()});
                        Window window = SwingUtilities.windowForComponent((Component)e.getSource());
                        window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING));
                    }
                });
    
                JPanel panel = new JPanel();
                panel.add(new JLabel("Please input a value and press ENTER key:"));
                panel.add(textField);
    
                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                dialog.add(panel);
                dialog.pack();
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);
            }
    
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {                
                    new Demo().createAndShowGUI();
                }
            });
        }
    }
    
     类似资料:
    • 我在更新/刷新表中的数据时遇到问题。我使用的是DefaultTableModel。以下是代码,请分享您的知识和建议。顺致敬意, *编辑1:*原始代码有一个更新表数据的函数,但事实证明这是错误的,因为构造函数一次又一次地创建新的JTable和新的JScrollPane。这就是为什么我创建了新的构造函数,并修复了这个bug。在我实现了新的构造函数之后,表数据仍然没有刷新。接下来,我尝试调试构造函数从另

    • 我正在尝试从 JTable 刷新数据。 此方法从数据库中选择数据: 然后我使用这个方法来刷新JTable中的数据: 错误:线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException: javax.swing.JTable$1 无法强制转换为 javax.swing.table.DefaultTableModel 然后我按下一个按钮来调用这个方法。有人

    • 我有一个从本地MySQL服务器获取信息的表。它很好地读取数据并将其发布在GUI上。 提前道谢。(给出一个关于DefaultTableModel的例子会很棒)

    • 问题内容: 我对/ 有问题。我的数据表未刷新/更新。我正在使用,根据代码,一切都很好,并且没有任何错误。我也有一个带有分页的表,这就是为什么我使用动作监听器和按钮“上一个”和“下一个”的原因。我正在从其他函数传递到在is中的类中编码的函数 。问题是我填充了包含表数据的数组,但是表不会更新/刷新它。这是我的代码。谢谢前进。 大编辑 旧代码已删除。我添加了新代码,可以帮助您了解我的问题。希望这会有所帮