2013-08-19 131 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