使用 ArrayList 创建 jTable

Posted

技术标签:

【中文标题】使用 ArrayList 创建 jTable【英文标题】:Create jTable with ArrayList 【发布时间】:2015-01-14 10:00:51 【问题描述】:

我搜索了一段时间,但找不到解决问题的方法。

我想在 JTable 中显示 ArrayList 的值,我对此很陌生,无法修复错误。

package Statistik;

import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class Statistic 

    private static ArrayList<String> rowA = new ArrayList();
    private static ArrayList<String> rowB = new ArrayList();
    private static ArrayList<String> rowC = new ArrayList();
    private static ArrayList<String> titel = new ArrayList();
    private static ArrayList<Object> table = new ArrayList();

    public static void main(String[] args) 

        titel.add("Name");
        titel.add("Art der Bearbeitung");
        titel.add("Datum");

        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");

        table.add(rowA);
        table.add(rowB);
        table.add(rowC);


        // Das JTable initialisieren
        JTable EndTable = new JTable( table , titel );

        JFrame frame = new JFrame( "Demo" );
        frame.getContentPane().add(new JScrollPane( EndTable ) );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    

    public static void addRows(String rowa, String rowb, String rowc) 

        rowA.add(rowa);
        rowB.add(rowb);
        rowC.add(rowc);

    


我无法将ArrayList table 设置为EndTable 中的第一个值,但我不知道该怎么做。

感谢大家尝试回答我的问题。

编辑

我的目标是制作一个列表

实体名称、变化的艺术、日期

所以我认为最好使用 ArrayList,因为它很灵活。 它必须灵活,因为我们不知道用户会改变多少。

【问题讨论】:

【参考方案1】:

也许你应该发布你的错误。 我可以从 Java API 中的 JTable 构造函数中看到,它不接受 ArrayList 作为参数。

JTable(Object[][] rowData, Object[] columnNames) 构造一个 JTable 显示二维数组 rowData 中的值,使用 列名,columnNames。

也许您应该尝试使用原始arrays

【讨论】:

有兴趣知道为什么我的答案被否决,据我所知这是正确的。如果我错了,我想知道我自己的理解。【参考方案2】:

您应该为您的表格创建自定义 TableModel,请参阅以下链接了解更多详细信息Custom JTable Model

下面是一些代码:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Test extends JFrame 
    public Test() 
        setBounds(100, 100, 500, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTable table = new JTable(new ModelData());
        add(new JScrollPane(table));
        setVisible(true);
    

    public static void main(String[] args) 
        new Test();
    


class ModelData extends AbstractTableModel 
    List<Data> data = new ArrayList<Data>();
    String colNames[] =  "Name", "Type", "Date" ;
    Class<?> colClasses[] =  String.class, String.class, Date.class ;

    ModelData() 
        data.add(new Data("name 1", "type 1", new Date()));
        data.add(new Data("name 2", "type 2", new Date()));
        data.add(new Data("name 3", "type 3", new Date()));
    

    public int getRowCount() 
        return data.size();
    

    public int getColumnCount() 
        return colNames.length;
    

    public Object getValueAt(int rowIndex, int columnIndex) 
        if (columnIndex == 0) 
            return data.get(rowIndex).getName();
        
        if (columnIndex == 1) 
            return data.get(rowIndex).getType();
        
        if (columnIndex == 2) 
            return data.get(rowIndex).getDate();
        
        return null;
    

    public String getColumnName(int columnIndex) 
        return colNames[columnIndex];
    

    public Class<?> getColumnClass(int columnIndex) 
        return colClasses[columnIndex];
    

    public boolean isCellEditable(int rowIndex, int columnIndex) 
        return true;
    

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) 
        if (columnIndex == 0) 
            data.get(rowIndex).setName((String) aValue);
        
        if (columnIndex == 1) 
            data.get(rowIndex).setType((String) aValue);
        
        if (columnIndex == 2) 
            data.get(rowIndex).setDate((Date) aValue);
        
        fireTableCellUpdated(rowIndex, columnIndex);
    


class Data 
    String name;
    String type;
    Date date;

    public Data(String name, String type, Date date) 
        super();
        this.name = name;
        this.type = type;
        this.date = date;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getType() 
        return type;
    

    public void setType(String type) 
        this.type = type;
    

    public Date getDate() 
        return date;
    

    public void setDate(Date date) 
        this.date = date;
    

结果如下:

【讨论】:

扩展AbstractTableModel 以获得所需的事件处理,对于example。 @trashgod 是的,你是对的,谢谢你的信息 :) +1 表示更新,但不要忘记在 setValueAt() 中触发相应的事件。【参考方案3】:

没有,因为JTable 没有为ArrayList 保留参数,但是一个技巧可以解决它!你知道JTable 的参数也是(Object[][], object[])

      Object[] tempTitel = titel.toArray(); // return Object[]

      String[][] tempTable = new String[table.size()][]; 

     int i = 0;
     for (List<String> next : table) 
      tempTable[i++] = next.toArray(new String[next.size()]); // return Object[][]
    



   JTable EndTable = new JTable(tempTable,tempTitel);

请注意,我将ArrayList&lt;String&gt; table= new ArrayList() 更改为ArrayList&lt;ArrayList&lt;String&gt;&gt; table = new ArrayList(); 所以当结合它时:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class Statistic 

    private static ArrayList<String> rowA = new ArrayList();
    private static ArrayList<String> rowB = new ArrayList();
    private static ArrayList<String> rowC = new ArrayList();
    private static ArrayList<String> titel = new ArrayList();
    private static ArrayList<ArrayList<String>> table = new ArrayList();

    public static void main(String[] args) 

        titel.add("Name");
        titel.add("Art der Bearbeitung");
        titel.add("Datum");

        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");
        addRows("buchung", "Created", "10.10.10");

        table.add(rowA);
        table.add(rowB);
        table.add(rowC);

          Object[] tempTitel = titel.toArray();
          String[][] tempTable = new String[table.size()][];
       int i = 0;
       for (List<String> next : table) 
       tempTable[i++] = next.toArray(new String[next.size()]);
        

       JTable EndTable = new JTable(tempTable,tempTitel);

        JFrame frame = new JFrame("Demo");
        frame.getContentPane().add(new JScrollPane(EndTable));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    

    public static void addRows(String rowa, String rowb, String rowc) 

        rowA.add(rowa);
        rowB.add(rowb);
        rowC.add(rowc);

    


【讨论】:

哇……哇!太感谢了!这对我帮助很大!但我有一个补充问题Why: private static ArrayList> ? ArrayList&lt;ArrayList&lt;String&gt;&gt; 与休闲数组中的String[][] 相同,我们要将其转换为Object[][] aahh 我本可以想到这个...谢谢您的解释! 你是不是有问题,为什么只看到 3 行???那是因为当您声明 addRows("buchung", "Created", "10.10.10")' 5 次时,您并没有添加 5 次行,而是将数据添加为 5 列(尝试正确理解我的话),并且因为您只通过“名称”创建 3 列, Art der Bearbeitung", "Datum" ,因此忽略其余 2 个数据(2 列) 我现在明白了,我遇到了需要更多列的问题,到目前为止我明白了,但我不知道如何使行单独(比如:有时 3,有时 15 个条目)但是我试着先自己弄清楚!谢谢Fev^^

以上是关于使用 ArrayList 创建 jTable的主要内容,如果未能解决你的问题,请参考以下文章

使用 ArrayList 创建一个动态二维整数数组

创建对象的 Arraylist

使用数组而不是 Java 中的 ArrayList 从用户输入创建一个新对象

ArrayList的使用

创建一个仅包含字符串的 ArrayList。使用增强的 for 循环打印 [关闭]

Groovy集合声明与访问 ( 使用 [] 创建 ArrayList 和 LinkedList 集合 | 集合赋初值 | 使用下标访问集合 | 使用 IntRange 作为下标访问集合 )