Java JTable仅在调用GUI()的新实例时刷新;

Java JTable仅在调用GUI()的新实例时刷新;,java,swing,user-interface,jtable,refresh,Java,Swing,User Interface,Jtable,Refresh,我有一个简单的JTable应用程序,只有在buttonListener方法中使用“new GUI()”时才能添加数据。否则就不行了。我试过使用每一个火炉台。。。方法在该代码中的每个位置。还尝试了mainFrame/mainPanel.repaint();表.重新验证() 主类 public class AddressBook { public static void main(String[] args) { try { UIManager.setLookA

我有一个简单的JTable应用程序,只有在buttonListener方法中使用“new GUI()”时才能添加数据。否则就不行了。我试过使用每一个火炉台。。。方法在该代码中的每个位置。还尝试了mainFrame/mainPanel.repaint();表.重新验证()

主类

public class AddressBook {

public static void main(String[] args) {
    try 
    { 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");  
        new GUI();
    }   
    catch(Exception e){ 
        System.out.println("GUI loading error..");
    }
}
}
GUI()类

MyTableModel类

class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;

static private ArrayList<Person> personList = new ArrayList<Person>();
Object[][] persons = new Object[personList.size()][4];

int row;
int col;
static String name;
static String surname;
String email;
static int telephone;
private String[] columnNames = {"First Name",
                                "Last Name",
                                "E-mail",
                                "Telephone"};

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

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

@Override
public int getRowCount() {
    return persons.length;
}

@Override
public Object getValueAt(int row, int col) {
    for(int i=0; i<personList.size(); i++) {
        persons [i][0] = personList.get(i).name.toString(); 
        persons [i][1] = personList.get(i).surname.toString(); 
        persons [i][2] = personList.get(i).mail.toString();
        persons [i][3] = personList.get(i).telephone; 
    }
    return persons[row][col];
}

public void fire(Object value, int row, int col) {
    persons[row][col] = value;
}

public void setValueAt(String n, String s, String e, int t){
    name = n;
    surname = s;
    email = e;
    telephone = t;
    Person person = new Person(n, s, e, t);
    personList.add(person);
    }
}

您的表格模型已损坏:

  • 在ArrayList和2D数组中都有奇怪的数据复制。完全摆脱2D对象数组,只需使用ArrayList,这是一个应该是静态的字段
  • 您需要给这个类一个
    addRow(personp)
    方法,并在该方法中向ArrayList添加另一个人,并调用
    fireTableRowsInserted(…)
    方法,传递正确的数据。这是应该从AddActionListener调用的方法
  • 或者让自己更轻松,根本不使用ArrayList,而是扩展DefaultTableModel并使用其方法。这将是如此简单和容易,这是我会做的
例如:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.*;

public class TableFun extends JPanel {
    public static final String[] COL_NAMES = { "First Name", "Last Name", "E-mail", "Telephone" };
    private MyTableModel2 model = new MyTableModel2(COL_NAMES);
    private JTable myTable = new JTable(model);

    public TableFun() {
        JButton addPersonBtn = new JButton(new AddPersonAction("Add Person"));
        JPanel btnPanel = new JPanel();
        btnPanel.add(addPersonBtn);

        setLayout(new BorderLayout());
        add(new JScrollPane(myTable));
        add(btnPanel, BorderLayout.PAGE_END);
    }

    private class AddPersonAction extends AbstractAction {
        public AddPersonAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            String name = "John";
            String surname = "Smith";
            String address = "Foo Street";
            String telephone = "222-222-5555";
            model.addRow(new Person(name, surname, address, telephone));
        }
    }

    private static void createAndShowGui() {
        TableFun mainPanel = new TableFun();

        JFrame frame = new JFrame("Table Fun");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private class MyTableModel2 extends DefaultTableModel {
        public MyTableModel2(String[] columnNames) {
            super(columnNames, 0);
        }

        public void addRow(Person person) {
            Object[] rowData = new Object[4];
            rowData[0] = person.getName();
            rowData[1] = person.getSurname();
            rowData[2] = person.getMail();
            rowData[3] = person.getTelephone();            
            super.addRow(rowData);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (getRowCount() > 0) {
                Object value = getValueAt(0, columnIndex);
                if (value != null) {
                    return value.getClass(); 
                }
            }
            return super.getColumnClass(columnIndex);
        }
    }
}

class Person {
    private String name;
    private String surname;
    private String mail;
    private String telephone;

    public Person(String n, String s, String m, String t) {
        name = n;
        surname = s;
        mail = m;
        telephone = t;
    }

    public String getName() {
        return name;
    }

    public String getSurname() {
        return surname;
    }

    public String getMail() {
        return mail;
    }

    public String getTelephone() {
        return telephone;
    }


}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入javax.swing.*;
导入javax.swing.table.*;
公共类TableFun扩展了JPanel{
公共静态最终字符串[]COL_NAMES={“First Name”、“Last Name”、“E-mail”、“Telephone”};
私有MyTableModel2模型=新的MyTableModel2(列名称);
私有JTable myTable=新JTable(模型);
公共桌游({
JButton addPersonBtn=newjbutton(newaddpersonAction(“addperson”));
JPanel btnPanel=新的JPanel();
添加(addPersonBtn);
setLayout(新的BorderLayout());
添加(新的JScrollPane(myTable));
添加(btnPanel,BorderLayout.PAGE_END);
}
私有类AddPersonAction扩展了AbstractAction{
public AddPersonAction(字符串名称){
超级(姓名);
}
@凌驾
已执行的公共无效操作(操作事件e){
字符串name=“John”;
字符串姓氏=“史密斯”;
字符串地址=“富街”;
字符串电话=“222-222-5555”;
addRow(新人(姓名、姓氏、地址、电话));
}
}
私有静态void createAndShowGui(){
TableFun主面板=新建TableFun();
JFrame=新JFrame(“桌上乐趣”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
私有类MyTableModel2扩展了DefaultTableModel{
公共MyTableModel2(字符串[]列名称){
超级(列名称,0);
}
公共无效添加行(人){
对象[]行数据=新对象[4];
rowData[0]=person.getName();
rowData[1]=person.getnam姓氏();
rowData[2]=person.getMail();
rowData[3]=person.getTelephone();
super.addRow(rowData);
}
@凌驾
公共类getColumnClass(int columnIndex){
如果(getRowCount()>0){
对象值=getValueAt(0,columnIndex);
if(值!=null){
返回值。getClass();
}
}
返回super.getColumnClass(columnIndex);
}
}
}
班主任{
私有字符串名称;
私家姓;
私人字符串邮件;
专用串电话;
公众人物(n串、s串、m串、t串){
name=n;
姓氏=s;
邮件=m;
电话=t;
}
公共字符串getName(){
返回名称;
}
公共字符串getNames(){
返回姓氏;
}
公共字符串getMail(){
回信;
}
公共字符串getTelephone(){
回电;
}
}
请注意,如果您按照建议消除代码的混乱,您自己的代码也可以工作:

class MyTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    private ArrayList<Person1> personList = new ArrayList<Person1>();
    private String[] columnNames = { "First Name", "Last Name", "E-mail", "Telephone" };

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

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

    @Override
    public int getRowCount() {
        return personList.size(); //!! 
    }

    @Override
    public Object getValueAt(int row, int col) {
        Person1 person = personList.get(row);
        switch (col) {
        case 0:
            return person.name;
        case 1:
            return person.surname;
        case 2:
            return person.mail;
        case 3: 
            return person.telephone;
        }
        return "";
    }

    public void setValueAt(String n, String s, String e, int t) {
        Person1 person = new Person1(n, s, e, t);
        personList.add(person);
        int firstRow = personList.size() - 1;
        int lastRow = firstRow;
        fireTableRowsInserted(firstRow, lastRow);
    }
}
类MyTableModel扩展了AbstractTableModel{ 私有静态最终长serialVersionUID=1L; private ArrayList personList=new ArrayList(); 私有字符串[]columnNames={“名字”、“姓氏”、“电子邮件”、“电话”}; @凌驾 public int getColumnCount(){ 返回columnNames.length; } @凌驾 公共字符串getColumnName(int-col){ 返回列名[col]; } @凌驾 public int getRowCount(){ 返回personList.size();/!! } @凌驾 公共对象getValueAt(整数行,整数列){ Person1 person=personList.get(行); 开关(col){ 案例0: 返回person.name; 案例1: 返回人。姓氏; 案例2: 返回person.mail; 案例3: 回信人电话; } 返回“”; } public void setValueAt(字符串n、字符串s、字符串e、int t){ 人员1人员=新人员1(n、s、e、t); personList.add(person); int firstRow=personList.size()-1; int lastRow=第一行; fireTableRowsInserted(第一排,最后一排); } }
请参见编辑以回答问题
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.*;

public class TableFun extends JPanel {
    public static final String[] COL_NAMES = { "First Name", "Last Name", "E-mail", "Telephone" };
    private MyTableModel2 model = new MyTableModel2(COL_NAMES);
    private JTable myTable = new JTable(model);

    public TableFun() {
        JButton addPersonBtn = new JButton(new AddPersonAction("Add Person"));
        JPanel btnPanel = new JPanel();
        btnPanel.add(addPersonBtn);

        setLayout(new BorderLayout());
        add(new JScrollPane(myTable));
        add(btnPanel, BorderLayout.PAGE_END);
    }

    private class AddPersonAction extends AbstractAction {
        public AddPersonAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            String name = "John";
            String surname = "Smith";
            String address = "Foo Street";
            String telephone = "222-222-5555";
            model.addRow(new Person(name, surname, address, telephone));
        }
    }

    private static void createAndShowGui() {
        TableFun mainPanel = new TableFun();

        JFrame frame = new JFrame("Table Fun");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private class MyTableModel2 extends DefaultTableModel {
        public MyTableModel2(String[] columnNames) {
            super(columnNames, 0);
        }

        public void addRow(Person person) {
            Object[] rowData = new Object[4];
            rowData[0] = person.getName();
            rowData[1] = person.getSurname();
            rowData[2] = person.getMail();
            rowData[3] = person.getTelephone();            
            super.addRow(rowData);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (getRowCount() > 0) {
                Object value = getValueAt(0, columnIndex);
                if (value != null) {
                    return value.getClass(); 
                }
            }
            return super.getColumnClass(columnIndex);
        }
    }
}

class Person {
    private String name;
    private String surname;
    private String mail;
    private String telephone;

    public Person(String n, String s, String m, String t) {
        name = n;
        surname = s;
        mail = m;
        telephone = t;
    }

    public String getName() {
        return name;
    }

    public String getSurname() {
        return surname;
    }

    public String getMail() {
        return mail;
    }

    public String getTelephone() {
        return telephone;
    }


}
class MyTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    private ArrayList<Person1> personList = new ArrayList<Person1>();
    private String[] columnNames = { "First Name", "Last Name", "E-mail", "Telephone" };

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

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

    @Override
    public int getRowCount() {
        return personList.size(); //!! 
    }

    @Override
    public Object getValueAt(int row, int col) {
        Person1 person = personList.get(row);
        switch (col) {
        case 0:
            return person.name;
        case 1:
            return person.surname;
        case 2:
            return person.mail;
        case 3: 
            return person.telephone;
        }
        return "";
    }

    public void setValueAt(String n, String s, String e, int t) {
        Person1 person = new Person1(n, s, e, t);
        personList.add(person);
        int firstRow = personList.size() - 1;
        int lastRow = firstRow;
        fireTableRowsInserted(firstRow, lastRow);
    }
}