0

我正在努力将我的arraylist 变成一个二维数组,然后将它添加到表格中以显示数据。

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。但后来我只得到 [[Ljava.lang.Object;@28864ae7 和 [[Ljava.lang.Object;@49214a13 表中的文本应该在哪里。

会欣赏任何答案:)

4

3 回答 3

2

您的列表实际上是 3D 数据结构(2D 数组列表),它应该只是 2D(数组列表):

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"}};是一个二维数组,然后将其添加到列表中(在此过程中使您的列表成为 3 维)。您的单元格不应该是二维的,它们代表您的行并且必须是一维数组。

替换为Object[] cell = {"nameHer", "GradeHer"};,它将起作用

于 2013-05-03T21:26:08.140 回答
2

行星钟

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);
  }
}
于 2013-05-04T02:31:48.340 回答
1

你处理这个问题是完全错误的。

DefaultTableModel 采用二维数组并为您显示所有内容,包括列标题。因此,如果没有看到您的 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()”调用放入单元格中。

于 2013-05-03T21:33:44.347 回答