2013-08-19 99 views
2

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

主类 - 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,以便在必须调整窗口大小并更新表格时显示新行!

  • 谢谢大家帮忙
+2

1-改变你的数据模型,数组不适合这个任务。 2-添加一个方法,将在您的表模型中创建一个新的“对象”行 – MadProgrammer

+0

@MadProgrammer我无法改变我需要它的数组,我的整个程序都是基于它的。你对新的行对象意味着什么? – Gerret

+0

一行通常由某种对象表示,在你的情况下,这是一个2D数组。数组不适合你想要实现的内容。它们很难动态增加,并且在做时会产生很高的开销。将数据存储在ArrayList中会更好,您可以使用ArrayList ,其中ArrayList中的每个项代表一行,Object []代表列值... – MadProgrammer

回答

3

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

+1

@Gerret [见simlair问题](http://stackoverflow.com/q/18281553/714968) – mKorbel

+0

@mKorbel引用了一个引人注目的例子;请注意,我犯了同样的错误(http://stackoverflow.com/posts/12352838/revisions)。 :-) – trashgod

+0

@trashgod你可以看看我的编辑请:)我只剩下一个问题了! – Gerret