有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java动态重置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-constructor`DefaultTableModel(String[]ColumnHeader,int行)。它坏了,因为我不知道此时的行数(我也不知道,因为这可能会改变)
  2. 一个想法:setTableModel(new TableModel(data, columnHeaders)在任何重画。但我想知道这是否是解决这个问题最低效的方法

我得到的错误:

  • ArrayIndexOutOfBoundsException来自我试图用于设置列标题的下一行:table.getColumnModel().getColumn(index).setValue(columnHeaders[index]);我的猜测:必须存在TableColumn才能使getColumn(index)工作
  • ArrayIndexOutOfBoundsException在使用以下方法实例化JTable时,从重置内容(查找当前代码)中获得异常:new JTable(new DefaultTableModel(columnHeaders, 0);0表示行数。我想这可能会起作用,因为我要重写它们。)我的猜测:行必须已经存在

TL;博士

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

共 (2) 个答案

  1. # 1 楼答案

    use the DefaultTableModel-constructor `DefaultTableModel (String[] columnHeaders, int rows). It went bad because I don't know the number of rows at this point (and I can't know, because this can change.)

    这是正确的方法。您只需将行设置为0。只有在第一次创建表/模型时才能执行此操作

    set content dynamically

    然后可以使用setRowCount(0)清除所有数据

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

    所以你的基本逻辑是:

    DefaultTableModel model = (DefaultTableModel)table.getModel();
    model.setRowCount(0);
    
    for(Object o:content) 
    {
        String[] rowData = presentAsStringArray(o);
        model.addRow( rowData );
    }
    
  2. # 2 楼答案

    不知道我是否理解你。当需要更改行数时,只需使用方法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++;
            }
         }
    }