使用AbstractTableModel向JTable添加行

时间:2013-08-19 09:12:33

标签: java swing jtable action abstracttablemodel

我需要帮助为我的JTable添加一个空行。我为我的JTable使用了AbstractTableModel!我这里有一个小的可执行程序,所以它更容易帮助我。

主类 - TestClass.java

package testproject;

import java.awt.event.ActionEvent;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JTable;

public class TestClass {

    String[] header = {"Name", "Quantity"};
    ArrayList<Object[]> data = new ArrayList<Object[]>();

    public TestClass() {
        data.add(new Object[]{"Apple", "234"});
        data.add(new Object[]{"Banana", "123"});
        data.add(new Object[]{"Cranberry", "346"});

        JFrame frame = new JFrame();
        JTable table = new JTable(new Model(data, header));
        JMenuBar menubar = new JMenuBar();
        JMenu editmenu = new JMenu("Edit");

        Action addrowaction = new AbstractAction("Add Row") {
            private static final long serialVersionUID = 1433684360133156145L;

            @Override
            public void actionPerformed(ActionEvent e) {
                data.add(new Object[9]);
            }
        };

        frame.add(table);

        frame.setJMenuBar(menubar);
        menubar.add(editmenu);
        editmenu.add(addrowaction);

        frame.setLocationByPlatform(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.pack();
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestClass();
            }
        });
    }
}

表模型 - Model.java

package testproject;

import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class Model extends AbstractTableModel{
    private static final long serialVersionUID = 6889542282067432083L;

    private String[] header;
    private ArrayList<Object[]> data;

    public Model(ArrayList<Object[]> data, String[] header) {
        this.header = header;
        this.data = data;
    }

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

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

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

    @Override
    public Object getValueAt(int row, int column) {
        return data.get(row)[column];
    }

    @Override
    public void setValueAt(Object value, int row, int column) {
        data.get(row)[column] = value;
        fireTableCellUpdated(row, column);
    }
}

基本上我想在编辑菜单中使用一个Action来添加一个空行。请不要回答其他链接!我搜索它但不理解它或它不适合我的程序!

编辑: 根据{{​​3}}的建议更新了来源!只剩下一个问题了。我如何更新JTable,以便在我必须调整窗口大小并且表正在更新时显示新行!

  • 谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

正如@MadProgrammer评论的那样,数组在概念上很容易理解,但很难扩展和扩展。合同。相反,请使用Collection。在此example中,MyModel管理以List<Row>实施的ArrayList<Row>。每个Row都是普通的旧Java对象(POJO),每个列都有一个属性。尝试使用构造函数作为示例添加插入新行的方法,然后尝试向Row添加列。该示例使用静态嵌套类来避免混乱。