Jtable java fireTableDataChanged()不工作

Jtable java fireTableDataChanged()不工作,jtable,Jtable,我已经构建了一个Java GUI,它将联系人数据添加到ArrayList。JTable也将从ArrayList进行更新。但是,添加新项目后,myJTable不会得到更新。我用过 table.repaint()和table.fireTableDataChanged()。这是代码。我不知道怎么了。尝试添加新联系人并查看更改。没什么 public class TableDemo extends JPanel implements ActionListener { private JLabel nam

我已经构建了一个Java GUI,它将联系人数据添加到
ArrayList
JTable
也将从
ArrayList
进行更新。但是,添加新项目后,my
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;
}   
}

当您打开新的
JFrame
以显示供用户输入的文本字段时,您将创建一个新的
TableDemo
对象,其中包含一个新的
MyTableModel
,因此您的
TableModel
fireTableDataChanged()
而不是您想要的
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();
            }
        });
    }

}
主机

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

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

添加联系人对话框

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;
    }
}
希望它能帮助你解决问题

帕特里克

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

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