2

我需要帮助来向我的 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);
    }
}

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

编辑:按照MadProgrammer的建议更新了源代码!只剩下一个问题了。我如何更新 JTable 以便在我必须调整窗口大小并且表格正在更新时显示新行!

  • 谢谢你的帮助
4

1 回答 1

3

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

于 2013-08-19T09:47:15.110 回答