java fireTableDataChanged()不起作用

时间:2014-04-13 04:35:32

标签: jtable

我已经构建了一个Java GUI,它将联系人数据添加到ArrayListJTable也会ArrayList更新JTable。但是,在添加新项目后,我的table.repaint()无法获得更新。我用过 table.fireTableDataChanged()public class TableDemo extends JPanel implements ActionListener { private JLabel name, contact; private JTextField nameField, contactField; private static JButton addButton, ok; JTable table; JFrame myFrame; MyTableModel myModel; public TableDemo() { super(new GridLayout(1, 0)); myModel = new MyTableModel(); myModel.fireTableDataChanged(); table = new JTable(myModel); table.setFillsViewportHeight(true); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); table.setFillsViewportHeight(true); // Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); // Add the scroll pane to this panel. add(scrollPane); } class MyTableModel extends AbstractTableModel { private String[] columnNames = { "Full Name", "Contact Number" }; ArrayList dataList = new ArrayList(); public MyTableModel() { } public MyTableModel(Contact c) { dataList.add(c); } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return dataList.size(); } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { Contact widget = (Contact) dataList.get(row); switch (col) { case 0: return widget.getFullName(); case 1: return widget.getPhoneNumber(); default: return null; } } public void setValueAt(Contact c, int row, int column) { Contact co = (Contact) dataList.get(row); switch (column) { } } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { return false; } public void addContact(Contact c) { dataList.add(c); fireTableDataChanged(); } } public void setValueAt(Object value, int row, int col) { // dataList = value; myModel.fireTableCellUpdated(row, col); } private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("TableDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the content pane. TableDemo newContentPane = new TableDemo(); newContentPane.setOpaque(true); // content panes must be opaque frame.setContentPane(newContentPane); addButton = new JButton("Add"); JPanel myPanel = new JPanel(); myPanel.add(addButton); addButton.addActionListener(new TableDemo()); frame.setLayout(new GridLayout(2, 1)); frame.setResizable(false); frame.setSize(500, 500); frame.add(myPanel); // Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub newFrame(); } public void newFrame() { myFrame = new JFrame(); JPanel myPanel = new JPanel(); name = new JLabel("Full Name"); nameField = new JTextField(10); contact = new JLabel("Contact Number"); contactField = new JTextField(10); ok = new JButton("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { myModel.addContact(new Contact(nameField.getText(), contactField.getText())); myFrame.dispose(); } }); myPanel.add(name); myPanel.add(nameField); myPanel.add(contact); myPanel.add(contactField); myPanel.add(ok); myFrame.add(myPanel); myFrame.setVisible(true); myFrame.setSize(250, 250); } } public class Contact { String fullName, phoneNumber; public Contact(String fullName, String phoneNumber) { this.fullName = fullName; this.phoneNumber = phoneNumber; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } >public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } } 。这是代码。我不知道出了什么问题。尝试添加新联系人并查看更改。没什么。

{{1}}

1 个答案:

答案 0 :(得分:1)

当您打开新的JFrame以显示用户输入的文字字段时,您会创建一个新的TableDemo对象,其中包含新的MyTableModel,因此您的TableModelfireTableDataChanged()但不是您想要的JTable

我为你创建了一个小例子,看看它是如何工作的。

MainApp类:

package de.professional_webworkx.blog.contactmanager;

import de.professional_webworkx.blog.contactmanager.view.frame.MainFrame;
import javax.swing.SwingUtilities;

/**
 *
 * @author Patrick Ott <Patrick.Ott@professional-webworkx.de>
 */
public class ContactManager {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                MainFrame mainFrame = new MainFrame();
            }
        });
    }

}

现在是Domainclass Contact

package de.professional_webworkx.blog.contactmanager.domain;

import java.io.Serializable;


public class Contact implements Serializable {

    private String firstName;
    private String lastName;

    protected Contact() {}

    public Contact(final String firstName, final String lastName) {
        this.firstName  = firstName;
        this.lastName   = lastName;
    }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return firstName + " " + lastName;
    }
}

MainFrame

package de.professional_webworkx.blog.contactmanager.view.frame;

import de.professional_webworkx.blog.contactmanager.business.listener.AddContactListener;
import de.professional_webworkx.blog.contactmanager.domain.Contact;
import de.professional_webworkx.blog.contactmanager.view.table.model.ContactTableModel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class MainFrame extends JFrame {

    private JTable contactTable;
    private JScrollPane scrollPane;
    private ContactTableModel tableModel;
    private List<Contact> contactList = new ArrayList<Contact>();

    private JButton addContact;

    public MainFrame() {

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Contact List Manager");
        JPanel contactTablePanel = initComponents();
        addContact = new JButton("add new Contact");
        addContact.addActionListener(new AddContactListener(contactTable));
        this.getContentPane().add(addContact, BorderLayout.NORTH);
        this.getContentPane().add(contactTablePanel, BorderLayout.CENTER);

        this.setSize(new Dimension(1024, 768));
        this.setVisible(true);
    }

    private JPanel initComponents() {
        JPanel panel = new JPanel();
        contactTable = new JTable(new ContactTableModel());
        scrollPane = new JScrollPane(contactTable);
        panel.add(scrollPane);
        return panel;
    }

}

ContactTableModel,在您的情况下是MyTableModel

package de.professional_webworkx.blog.contactmanager.view.table.model;

import de.professional_webworkx.blog.contactmanager.domain.Contact;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;


public class ContactTableModel extends AbstractTableModel {

    private final String[] columnNames = {"Firstname", "Lastname"};
    List<Contact> contactList;

    public ContactTableModel() {
    contactList = new ArrayList<>();
    contactList.add(new Contact("Patrick", "Ott"));
    }

    @Override
    public int getRowCount() {
        return contactList.size();
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column];
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Contact contact = contactList.get(rowIndex);
        switch(columnIndex) {
            case(0):
                return contact.getFirstName();
            case(1):
                return contact.getLastName();
        }

        return null;
    }

    public void addContact(final Contact contact) {
        contactList.add(contact);
        fireTableDataChanged();
    }
}

AddContactListener类

package de.professional_webworkx.blog.contactmanager.business.listener;

import de.professional_webworkx.blog.contactmanager.domain.Contact;
import de.professional_webworkx.blog.contactmanager.view.dialogs.AddContactDialog;
import de.professional_webworkx.blog.contactmanager.view.table.model.ContactTableModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTable;

public class AddContactListener implements ActionListener {

    private JTable table;

    public AddContactListener(final JTable table) {
        this.table  = table;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        ContactTableModel model = (ContactTableModel)this.table.getModel();
        AddContactDialog dialog = new AddContactDialog();
        String firstName = dialog.getFirstName();
        String lastName = dialog.getLastName();
        model.addContact(new Contact(firstName, lastName));
    }

}

不要打开新的JFrame,而是使用自己的JDialog实现。

AddContactDialog

package de.professional_webworkx.blog.contactmanager.view.dialogs;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class AddContactDialog extends JDialog {

    JButton ok, close;
    JTextField firstNameField;
    JTextField lastNameField;
    String firstName;
    String lastName;


    private final AddContactDialog dialog;

    public AddContactDialog() {
        this.dialog = this;
        this.setLayout(new BorderLayout(10, 10));
        this.setModal(true);
        this.setTitle("create new Contact");
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.setSize(new Dimension(350, 200));
        this.getContentPane().add(initInputPanel(), BorderLayout.NORTH);
        this.getContentPane().add(initDialogPanel(), BorderLayout.SOUTH);
        this.pack();
        this.setVisible(true);
    }

    /*
        inits the TextField Panel
    */
    private JPanel initInputPanel() {
        JPanel panel = new JPanel(new GridLayout(2, 2));
        firstNameField  = new JTextField();
        lastNameField   = new JTextField();
        panel.add(new JLabel("Firstname: "));
        panel.add(firstNameField);

        panel.add(new JLabel("Lastname: "));
        panel.add(lastNameField);

        return panel;
    }
    /*
        inits the ButtonPanel
    */
    private JPanel initDialogPanel() {
        JPanel panel = new JPanel(new GridLayout(1, 2));
        ok      = new JButton("save");
        ok.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                firstName   = firstNameField.getText();
                lastName    = lastNameField.getText();
                dialog.setVisible(false);
            }
        });
        close   = new JButton("cancel");
        close.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
            }
        });
        panel.add(ok);
        panel.add(close);
        return panel;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

希望它有助于解决您的问题。

帕特里克