动态重置JTable的内容;设置列标题一次

时间:2018-04-19 13:25:47

标签: java swing jtable

在我的java代码中,我使用JTable。它不需要编辑,它会显示一些内容。

我必须:

  • 设置一次列标题
  • 动态设置内容

到现在为止,我有这个:

public class MyClass {
 final JTable table;

 public MyClass(List<List> changingContent, String[] columnHeaders) {
  table = new JTable(new DefaultTableModel());
  initTable(columnHeaders); //only done once
  redrawTable(changingContent); //happens always when content changed
 }

 public void initTable(String[] columnHeaders) {
  //???? 1)
 }

 public void redrawTable(List<List> content) {
  int index = 0;
    for(Object o:content) {
        String[] rowData = presentAsStringArray(o);

        for(int i=0; i<rowData.length; i++) {
            int row = index;
            int column = i;

            //this produces an error since the rows don't exist yet
            table.getModel().setValueAt(rowData[i], row, column);
        }
        index++;
    }
 }
}

我试图:

  1. 使用DefaultTableModel - 构造函数`DefaultTableModel(String [] columnHeaders,int rows)。它变坏了,因为我不知道此时的行数(我不知道,因为这可能会改变。)
  2. 一个想法:setTableModel(new TableModel(data, columnHeaders)在任何重绘。但我想知道这不是解决这个问题的最有效方法。
  3. 我得到的错误:

      我尝试用来设置列标题的以下行中的
    • ArrayIndexOutOfBoundsException table.getColumnModel().getColumn(index).setValue(columnHeaders[index]); 我猜: TableColumn已经有存在使getColumn(index)工作。
    • ArrayIndexOutOfBoundsException 来自重置内容(查找当前代码)时使用以下方式实例化JTablenew JTable(new DefaultTableModel(columnHeaders, 0);0表示行数。我认为这可行,因为我要重写它们。)我猜:行已经存在。

    TL; DR

    1. 创建MyClass时,我获得了JTable的列标题。
    2. 我知道表数据的模型,但它正在动态变化。
    3. 方法redrawTable将在任何更改时运行。
    4. 我找到了一种能够重绘细胞的方法。不幸的是,行数取决于。
    5. 最后的猜测:我很确定在任何重绘时都可以重置TableModel。但它对我来说似乎并不高效。 为什么(不)这样做?

2 个答案:

答案 0 :(得分:0)

不确定我是否纠正了你。当您需要更改行数时,只需使用方法DefaultTableModel.setRowCount(int)即可。像这样:

public class MyClass {
     final JTable table;
     final DefaultTableModel model;

     public MyClass(List<List> changingContent, String[] columnHeaders) {
          model = new DefaultTableModel(columnHeaders, 0); // init model with 0 rows
          table = new JTable(model);
          redrawTable(changingContent); //happens always when content changed
     }


     public void redrawTable(List<List> content) {
        model.setRowCount(content.size()); // set the correct row count here
        int index = 0;
        for(Object o:content) {
            String[] rowData = presentAsStringArray(o);

            for(int i=0; i<rowData.length; i++) {
                int row = index;
                int column = i;

                //this produces an error since the rows don't exist yet
                model.setValueAt(rowData[i], row, column);
            }
            index++;
        }
     }
}

答案 1 :(得分:0)

  

使用DefaultTableModel构造函数`DefaultTableModel(String [] columnHeaders,int rows)。它变坏了,因为我不知道此时的行数(我不知道,因为这可能会改变。)

这是正确的方法。您只需将行设置为0.只有在第一次创建表/模型时才会这样做。

  

动态设置内容

然后您可以使用setRowCount(0);

清除所有数据

然后使用DefaultTableModel的addRow(...)方法动态添加行。

所以你的基本逻辑是:

DefaultTableModel model = (DefaultTableModel)table.getModel();
model.setRowCount(0);

for(Object o:content) 
{
    String[] rowData = presentAsStringArray(o);
    model.addRow( rowData );
}