使用ArrayList创建jTable

时间:2014-11-17 13:15:34

标签: java swing arraylist jtable

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

我想在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是最好的,因为它很灵活。 它必须是灵活的,因为我们不知道用户将改变多少。

3 个答案:

答案 0 :(得分:5)

您应该为表创建自定义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;
    }
}

这就是结果:

enter image description here

答案 1 :(得分:2)

从那以后,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<String> table= new ArrayList()更改为ArrayList<ArrayList<String>> 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);

    }

}

答案 2 :(得分:0)

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

  

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

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