【问题标题】:Create jTable with ArrayList使用 ArrayList 创建 jTable
【发布时间】: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,因为它很灵活。 它必须灵活,因为我们不知道用户会改变多少。

【问题讨论】:

    标签: java swing arraylist jtable


    【解决方案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^^
    猜你喜欢
    • 2013-04-04
    • 2023-01-04
    • 2013-09-26
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多