2013-05-03 34 views
0

我很努力地將我的數組列表變成一個二維數組,然後將它添加到表中以顯示數據。Arraylist到二維數組,然後到一個JTable

import java.awt.*; 
import javax.swing.*; 
import java.util.ArrayList; 
import java.util.List; 

public class Planettabell 
{ 
public static void main(String[] args) 
    { 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
     JFrame vindu = new Test(); 
     vindu.setVisible(true); 
     } 
    }); 
    } 
} 

class Test extends JFrame 
{ 
    private String[] name = {"Name", "grade"}; 

    Object[][] cell = {{"nameHer", "GradeHer"}}; 
    Object[][] cell2 = {{"nameHer2", "gradeHer2"}}; 
    Object[][] cell3 = {{"nameHer3", "gradeHer3"} }; 

    public Test() 
    { 
    setTitle("Planettabell"); 
    setSize(500, 210); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    List<Object[]> list = new ArrayList<Object[]>(); 
    list.add(cell); 
    list.add(cell2); 
    list.add(cell3); 

    Object[][]array = list.toArray(new Object[list.size()][]); 

    JTable tabell = new JTable(array, name); 

    Container c = getContentPane(); 
    c.setLayout(new FlowLayout()); 
    c.add(new JScrollPane(tabell), BorderLayout.CENTER); 
    } 


} 

如果我運行它 Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1

此代碼工作,如果我加入,而不是在JTable的「數組」「細胞」,我會得到這個消息,但我需要從列表整個陣列工作。

我也嘗試:的

int number = list.size()/2; 
Object[][] ArrayNew = new Object[number][2]; 
for(int x = 0; x< number; x++) 
{ 
    for(int z = 0; z < 2; z++) 
    { 
     int y = 2 * x; 
     ArrayNew [x][z] = list.get(y+z); 
    } 
} 

JTable tabell = new JTable(ArrayNew, name); 

代替list.toarray。但是,我只能gett [[Ljava.lang.Object; @ 28864ae7和[[Ljava.lang.Object; @ 49214a13表中的文本應該是。

將appreicate任何答案:)

+0

[這個問題]的可能的複製(http://stackoverflow.com/questions/2146488/converting-an-arraylist-into-a-2d-array)。如果沒有,那麼它可能會提供一些靈感:) – davmos 2013-05-03 21:06:27

+0

我以前見過這個問題,我已經嘗試了答案,但可悲的是他們中沒有人似乎爲我工作 – Madde 2013-05-03 21:30:04

回答

2

您的清單是一個有效的3D數據結構(二維數組列表),它應該是唯一的二維(陣列列表):

Object[] information = {"nameHer", "GradeHer"}; 
List<Object[]> list = new ArrayList<Object[]>(); 
list.add(information); // more data here 

Object[][]array = list.toArray(new Object[list.size()][]); 

在你的代碼Object[][] cell = {{"nameHer", "GradeHer"}};是一個二維數組,然後將它添加到列表中(使列表中的三維空間列表)。 您的單元不應該是2D,它們代表您的行並且必須是1D數組。

通過Object[] cell = {"nameHer", "GradeHer"};更換,也將努力

+0

我仍然得到「[[email protected]」在試圖運行程序時,表格應該是什麼位置 – Madde 2013-05-03 21:46:38

+1

您可以添加一個[SSCE](http://sscce.org/),以便我們可以複製您的問題? – Guillaume 2013-05-03 22:18:55

+0

是的,我已經將我的問題中的代碼更改爲一個小程序 – Madde 2013-05-04 00:16:04

1

你處理這個問題完全錯誤的。

DefaultTableModel需要一個2d數組並顯示包括列標題在內的所有內容。所以,沒有看到你的KarakterTabell的代碼,我無法想象你想要達到什麼。

要正確地創建表模型,您只需要有一種方法以x,y方式訪問數據。然後,通過數據流在這個新的模型時,桌子上來它將運行:

public class KarakterTableModel implements TableModel { 
    List<String[]> data = new ArrayList<String[]>(); 

    public KarakterTableModel(BufferedReader reader) { 
     while(reader.ready()) { 

     String columnData = reader.readLine(); 
     String[] columns = columnData.split(" "); 
     data.add(columns); 
     } 
    } 
    public Object getValueAt(int x, int y) { 
     String[] row = data.get(x); 
     return row[y]; 
    } 

} 

JTable table = new Jtable(new KarakterMode(new BufferedReader(System.in)); 

還記得:這是公共對象 getValueAt() - JTable中將把「的toString()」從這個呼叫返回的任何內容調用到單元格中。

2

Planettabell

import java.awt.*; 
import javax.swing.*; 
import java.util.ArrayList; 
import java.util.List; 

public class Planettabell 
{ 
public static void main(String[] args) 
    { 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
     JFrame vindu = new Test(); 
     vindu.setVisible(true); 
     } 
    }); 
    } 
} 

class Test extends JFrame 
{ 
    private String[] name = {"Name", "grade"}; 

    Object[][] cells = { 
     {"nameHer", "GradeHer"}, 
     {"nameHer2", "gradeHer2"}, 
     {"nameHer3", "gradeHer3"} 
    }; 

    public Test() 
    { 
    setTitle("Planettabell"); 
    setSize(500, 210); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JTable tabell = new JTable(cells, name); 

    Container c = getContentPane(); 
    c.setLayout(new FlowLayout()); 
    c.add(new JScrollPane(tabell), BorderLayout.CENTER); 
    } 
} 
+0

嗨,thx回答,唯一的問題是,我需要它來自arraylist,因爲我的真實程序不知道有多少人(它可以在任何時候或多或少)它在系統中。因此我不知道它會有多少個細胞。 – Madde 2013-05-04 02:37:58

+0

因此,要麼1)在插入表之前將'ArrayList'構建到2D數組中或2)創建一個'TableModel'來接受'ArrayList'。沒有問題,只是替代品。 – 2013-05-04 02:42:23

+0

我想將arraylist轉換成二維數組,如果這是你的意思?但它並不像你在程序中看到的那樣工作。 – Madde 2013-05-04 02:45:12