Java Swing JTable:由于表模型的使用/创建不正确,无法访问表中的值

时间:2012-12-05 22:24:20

标签: java swing jtable tablemodel abstracttablemodel

我刚刚开始使用Java Swing进行编程。我对许多Java Swing Classes中的每一个都不是很熟悉,并且遇到了关于创建表的绊脚石。

我试图弄清楚如何将表添加到我正在制作的Java Swing程序中。我查看了docs.oracle.com试图找出它,但是当我尝试访问表的值时出现错误。我将包含我的代码,以帮助显示我当前正在尝试做的以及错误的位置。

这是我制作表格和表格模型的代码(我认为问题是我的桌面模型无法正常工作):

        /*Create the Table Entry*/
        columnNames = new String[listoffields.size()+1];
        columnNames[0] = "Record Number";
        for(int a = 1; a < columnNames.length;a++){
            columnNames[a] = listoffields.get(a-1).getTitle();
        }
        int count = 1;
        data = new Object[numrecords][listoffields.size()+1];
        for(int a = 0; a < numrecords;a++){
            for(int b = 0; b < listoffields.size()+1;b++){
                if(b == 0){
                    data[a][b] = count;
                    count++;
                }
                else{
                    data[a][b] = "";
                }
            }
        }

        /* create the table */
        JTable table = new JTable(data,columnNames);
        table.setCellSelectionEnabled(true);
        table.setModel(new AbstractTableModel() {
            public String getColumnName(int col) {
                return columnNames[col].toString();
            }
            public int getRowCount() { return data.length; }
            public int getColumnCount() { return columnNames.length; }
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
            public boolean isCellEditable(int row, int col) {
                return (col >= 1);
            }
            public void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
        });
        JScrollPane scrollPane = new JScrollPane(table);
        table.setFillsViewportHeight(true);

        /* addthe table to the JTable tableentry*/
        tabelentry.setLayout(new BoxLayout(ProjectFrame.tabelentry, BoxLayout.Y_AXIS));
        tabelentry.add(scrollPane);
        tabelentry.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

显示表格并编辑每个单元格的空白值后,单击提交单元格的提交按钮。但是,遇到以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
   at java.util.Vector.elementAt(Unknown Source)
   at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
   at Client.GUIComponents.ProjectFrame$1.submit(NameOfFile.java:LineNumber)

尝试按如下方式提交时遇到错误:

public void submit(){
   String recordvalues = ""; //contains a String representation of what I want to submit
   for(int a = 0; a < numberoffields;a++){
      for(int b = 0; b < numberofrecords;b++){
         if(a != 0){ //I want to skip the first column
            recordvalues = recordvalues  + (String) tabelentry.getModel().getValueAt(b, a) + ","; //The error is at this line in the code
         }
      }
   }
}

我提供了我的代码,以举例说明我遇到的当前问题以及我目前所尝试的问题。为了概括我的问题,我想知道如何正确编写表模型类,以便我可以访问表中每个单元格的值。任何帮助都会有所帮助。万分感谢!

2 个答案:

答案 0 :(得分:2)

我的想法是你正在创建两个不同的表模型。

JTable table = new JTable(data,columnNames);
table.setCellSelectionEnabled(true);
table.setModel(new AbstractTableModel() {...

new JTable(data,columnNames)实际上是根据您提供的信息创建自己的DefaultTableModel。尝试删除table.setModel(new AbstractTableModel() {...代码

另一个相关的问题是,我不知道如何声明datacolumnNames

阅读How to Use Tables了解更多详情

<强>更新

正如Hovercraft所指出的另一个问题是你将一个表添加到另一个表然后访问错误的模型。

表格创建应该更像......

tableEntry = new JTable(data,columnNames);
JScrollPane scrollPane = new JScrollPane(tableEntry );
tableEntry .setFillsViewportHeight(true);
// Don't forget to add the scroll pane to you view !!

然后你提交的方法看起来应该更像...

public void submit(){
    String recordvalues = ""; //contains a String representation of what I want to submit
    TableModel model = tableEntry.getModel();
    for(int a = 0; a < model.getColumnCount();a++){
        for(int b = 0; b < model.getRowCount();b++){
            if(a != 0){ //I want to skip the first column
                recordvalues = recordvalues  + (String) model.getValueAt(b, a) + ","; //The error is at this line in the code
            }
        }
    }
}

答案 1 :(得分:1)

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0

此异常表示table的列大小为0,我认为是因为您没有在TableModel中添加列。

尝试创建多个TableColumn Column = new TableColumn();,然后将这些列添加到table