Java 为什么要在模型中额外调用getColumnClass()?

Java 为什么要在模型中额外调用getColumnClass()?,java,jtable,tablemodel,Java,Jtable,Tablemodel,发现了这个演示TableModel使用的很好的示例程序 import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; public class TableExample extends JFrame { public TableE

发现了这个演示TableModel使用的很好的示例程序

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class TableExample extends JFrame
{
public TableExample()
{
    //headers for the table
    String[] columns = new String[] {
        "Id", "Name", "Hourly Rate", "Part Time"
    };

    //actual data for the table in a 2d array
    Object[][] data = new Object[][] {
        {1, "John", 40.0, false },
        {2, "Rambo", 70.0, false },
        {3, "Zorro", 60.0, true },
    };

    final Class[] columnClass = new Class[] {Integer.class, String.class, Double.class, Boolean.class};

    //create table model with data
    DefaultTableModel model = new DefaultTableModel(data, columns) {

        @Override
        public boolean isCellEditable(int row, int column)
        {
            System.out.println("Inside isCellEditable("+ row +","+ column + ")");
            return false;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex)
        {
            System.out.println("Inside getColumnClass("+ columnIndex +")");
            return columnClass[columnIndex];
        }
    };

    JTable table = new JTable(model);

    //add the table to the frame
    this.add(new JScrollPane(table));

    this.setTitle("Table Example");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
    this.pack();
    this.setVisible(true);
}

public static void main(String[] args)
{
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new TableExample();
        }
    });
}   
}
共有4列和3行,预计getColumnClass将执行12次。基本上执行4次(每列一次)和每行3次

实际上有6次迭代,而不是3次。 嗯,所以它可能会对列标题执行一次,但这仍然会留下两次额外的迭代。也许它也在末尾执行空白行,但是它仍然留下1个额外的值。
为什么迭代次数比预期的要多?

每当渲染单元时,都会调用此方法,并且在创建时可能会多次渲染该单元。这并不是意外的行为。Hmmm,所以可能它会对每一行调用一次,然后对每一行再次调用以进行渲染。运行了一些快速测试,改变了行数,并假设每行有2个调用,则无论行数如何,始终有两个执行。感谢您提供的信息。令人高兴的是,该方法仅对可见单元格调用。尝试这个有数千行。我有一个问题在这种情况下!!!我有一个JTable和一个定制表模型。我还重写了getColumnClass方法。但它没有得到我表格的最后一列?您知道原因吗?任何时候渲染单元格时都会调用此方法,并且在创建时可能会多次渲染该单元格。这并不是意外的行为。Hmmm,所以可能它会对每一行调用一次,然后对每一行再次调用以进行渲染。运行了一些快速测试,改变了行数,并假设每行有2个调用,则无论行数如何,始终有两个执行。感谢您提供的信息。令人高兴的是,该方法仅对可见单元格调用。尝试这个有数千行。我有一个问题在这种情况下!!!我有一个JTable和一个定制表模型。我还重写了getColumnClass方法。但它没有得到我表格的最后一列?你知道原因吗?
Inside getColumnClass(0)
Inside getColumnClass(1)
Inside getColumnClass(2)
Inside getColumnClass(3)
Inside getColumnClass(0)
Inside getColumnClass(1)
Inside getColumnClass(2)
Inside getColumnClass(3)
Inside getColumnClass(0)
Inside getColumnClass(1)
Inside getColumnClass(2)
Inside getColumnClass(3)
Inside getColumnClass(0)
Inside getColumnClass(1)
Inside getColumnClass(2)
Inside getColumnClass(3)
Inside getColumnClass(0)
Inside getColumnClass(1)
Inside getColumnClass(2)
Inside getColumnClass(3)
Inside getColumnClass(0)
Inside getColumnClass(1)
Inside getColumnClass(2)
Inside getColumnClass(3)