使用DefaultTableModel时,在JTable中刷新数据

时间:2014-03-25 23:19:38

标签: java swing jtable actionlistener defaulttablemodel

我有一个JFrame,我构建了一个JTable

JTable分两步进行:

  1. 我制作了一个函数initTable(),我制作了我的表

  2. 我创建了另一个函数initDataintoTable(),它将我的数据从arraylist广告到我的桌子。

  3. 到目前为止一切正常。当我尝试更新JTable时出现问题。事实上,我打开JDialog并尝试列表中的新项目。我到了使用新项目修改Arraylist的问题,但我无法更新我的表格,我真的不知道在哪里放fireTableDataChanged()例如以及如何调用它,当我想要它。

    在initDataintoTable中,我将一个TableModelListener添加到我的DefaultTableModel表模型中。

    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);
        }
    }
    

    在我的jDialog中,我在Ok按钮上有一个ActionListener:

    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 个答案:

答案 0 :(得分:3)

您永远不必明确调用fireTableDataChanged方法,因为数据更改后,TableModel实施可以通知 视图 插入/更新/删除)。

在您调用tablemodel.addRow(...)的情况下,表格 模型 会通知 视图 数据已经改变,最后一个数据将被更新。

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

修改

您在评论中说明:

  

如果没有getTable静态,我无法做jframe.getTable(),而我   如果不使表静态,则无法获得getTable()静态。做完之后   这个,我的程序就像我想的那样工作。

如果您必须添加static修饰符才能使其正常工作,那么您就遇到了设计问题。您的代码中可能存在变量的范围问题。请参阅下面的示例:InputDialog是一个不同的类,它包含对没有任何static变量的表模型的引用。

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();
            }
        });
    }
}