【问题标题】:Arraylist to 2D array and then to a JTableArraylist 到 2D 数组,然后到 JTable
【发布时间】:2013-05-03 20:50:38
【问题描述】:

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

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 表中的文本应该在哪里。

会欣赏任何答案:)

【问题讨论】:

  • this question 的可能重复项。如果没有,那么它可能会提供一些灵感:)
  • 我以前看过这个问题,我已经尝试过答案,但遗憾的是似乎没有一个适合我

标签: java swing list jtable multidimensional-array


【解决方案1】:

您的列表实际上是 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"}; 就可以了

【讨论】:

  • 在尝试运行程序时,我仍然会得到“[Ljava.lang.Object@478e2443”表应该在的位置
  • 是的,我已将问题中的代码更改为一个小程序
  • 我认为您在我的回答中遗漏了部分更正,请查看您的单元格的声明;)
  • 嘿,谢谢再次回答:] 它确实适用于该更正。再次感谢,我真的很感激:)
【解决方案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);
  }
}

【讨论】:

  • 嗨,谢谢回答,唯一的问题是我需要它来自数组列表,因为我的真实程序不知道有多少人(随时可能或多或少)它是在系统中。所以我不知道它会有多少个细胞。
  • 因此,要么 1) 在插入表之前将 ArrayList 构建到二维数组中,要么 2) 创建一个接受 ArrayListTableModel。没有问题,只有替代品。
  • 我正在尝试将 arraylist 转换为二维数组,如果这是您的意思?但它似乎不像你在程序中看到的那样工作。
【解决方案3】:

你完全错误地解决了这个问题。

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));

还请记住:它是公共的 Object getValueAt() —— JTable 会将从此调用返回的任何内容的“toString()”调用放入单元格中。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2023-03-12
    • 2012-03-18
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2013-12-29
    相关资源
    最近更新 更多