Java JTable数据在滚动之前不会显示?

Java JTable数据在滚动之前不会显示?,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我在滚动窗格中有一个JTable,其中包含来自ExtendedDefaultTableModel的数据。当我将数据加载到表中时,它会显示列。滚动条显示数据在那里,但不显示。我一滚动数据就会显示出来。我在模型上尝试了所有类型的fire()事件,在Jtable上尝试了.repaint()、.revalidate等,但都无法正常工作。显然没有调用CellRenderer。我如何解决这个问题 public void setTestcaseModel(TestcaseTableModel test

我在滚动窗格中有一个JTable,其中包含来自ExtendedDefaultTableModel的数据。当我将数据加载到表中时,它会显示列。滚动条显示数据在那里,但不显示。我一滚动数据就会显示出来。我在模型上尝试了所有类型的fire()事件,在Jtable上尝试了.repaint()、.revalidate等,但都无法正常工作。显然没有调用CellRenderer。我如何解决这个问题

    public void setTestcaseModel(TestcaseTableModel testcase_model, List<String> names) {


            this.testcaseTableModel = testcase_model;
            testcaseTable.setModel(this.testcaseTableModel);
            testcaseTable.setRowHeight(40);
            TableColumn column = testcaseTable.getColumnModel().getColumn(0);
            column.setCellRenderer(new TestcaseCellRenderer(names, this, tgc));
            TestcaseCellEditor editor = new TestcaseCellEditor(testcaseTable,this);
            column.setCellEditor(editor);
            editor.addCellEditorListener(tgc);
            this.testcaseTableModel.fireTableDataChanged();

        }
public void setTestcaseModel(TestcaseTableModel testcase_model,列表名称){
this.testcaseTableModel=testcase\u model;
setModel(this.testcaseTableModel);
测试用例可设置行高(40);
TableColumn column=testcaseTable.getColumnModel().getColumn(0);
setCellRenderer(新的TestcaseCellRenderer(name,this,tgc));
TestcaseCellEditor=newTestCaseCellEditor(testcaseTable,this);
column.setCellEditor(编辑器);
addCellEditorListener(tgc);
this.testcaseTableModel.fireTableDataChanged();
}
测试用例表模型
包gui.table;
导入java.util.List;
导入java.util.Vector;
导入javax.swing.table.DefaultTableModel;
导入org.jdom2.Element;
@抑制警告(“串行”)
公共类TestcaseTableModel扩展了DefaultTableModel{
String[]columnNames={“Testcase”};
向量行_数据=新向量();
公共TestcaseTableModel(元素testSuite){
行_data.clear();
List testcase_List=testSuite.getChildren(“testcase”);
字符串[]数据;
对于(int i=0;i

谢谢您的建议。

您正在扩展DefaultTableModel。DefaultTableModel已经将列名和数据存储在自己的向量中。它的所有方法都在DefaultTableModel的向量中查找数据

您的子类重新创建另一个向量来存储数据。这是不可能的:基类方法不知道也不关心这个新向量

要么希望自己的数据结构存储数据和列名,要么扩展
AbstractTableModel
。或者您想要使用
DefaultTableModel
,并且您不能拥有自己的数据结构,因为
DefaultTableModel
已经定义了自己的数据结构。除了
getColumnClass()
,您不应该重写
DefaultTableModel
的任何方法。如果这样做,或者添加方法,则这些方法应始终委托给
DefaultTableModel
中的方法

例如:

public class TestcaseTableModel extends DefaultTableModel {

    // no vector here!!

    public TestcaseTableModel(Element testSuite) {
        // delegate to the parent constructor  
        super(createDataVector(testSuite), createColumNames());
    }

    private static Vector<Vector<Object>> createDataVector() {
        List<Element> testcase_list = testSuite.getChildren("TestCase");
        Vector<Vector<Object>> data;
        for (int i = 0; i < testcase_list.size(); i++) {
            Vector<Object> row = new Vector<Object>();
            row.add("");
            row.add("failed");
            row.add(testcase_list.get(i).getAttributeValue("id"));
            row.add("play");
            data.add(row);
       }
       return data;
    }

    private static Vector<String> createColumnNames() {
        Vector<String> result = new Vector<String>(); 
        result.add("TestCase");
        result.add("");
        result.add("");
        result.add("");
        return result;
    }

    /**
     * overridden to ignore null values
     */
    @Override
    public void setValueAt(Object value, int row, int col) {
        if (value == null) {
            return;
        }
        // delegate to the parent method
        super.setValueAt(value, row, col);
    }
}
公共类TestcaseTableModel扩展了DefaultTableModel{
//这里没有矢量!!
公共TestcaseTableModel(元素testSuite){
//委托给父构造函数
super(createDataVector(testSuite),createColumnNames());
}
私有静态向量createDataVector(){
List testcase_List=testSuite.getChildren(“testcase”);
矢量数据;
对于(int i=0;i
您正在扩展DefaultTableModel。DefaultTableModel已经将列名和数据存储在自己的向量中。它的所有方法都在DefaultTableModel的向量中查找数据

您的子类重新创建另一个向量来存储数据。这是不可能的:基类方法不知道也不关心这个新向量

要么希望自己的数据结构存储数据和列名,要么扩展
AbstractTableModel
。或者您想要使用
DefaultTableModel
,并且您不能拥有自己的数据结构,因为
DefaultTableModel
已经定义了自己的数据结构。除了
getColumnClass()
,您不应该重写
DefaultTableModel
的任何方法。如果这样做,或者添加方法,则这些方法应始终委托给
DefaultTableModel
中的方法

例如:

public class TestcaseTableModel extends DefaultTableModel {

    // no vector here!!

    public TestcaseTableModel(Element testSuite) {
        // delegate to the parent constructor  
        super(createDataVector(testSuite), createColumNames());
    }

    private static Vector<Vector<Object>> createDataVector() {
        List<Element> testcase_list = testSuite.getChildren("TestCase");
        Vector<Vector<Object>> data;
        for (int i = 0; i < testcase_list.size(); i++) {
            Vector<Object> row = new Vector<Object>();
            row.add("");
            row.add("failed");
            row.add(testcase_list.get(i).getAttributeValue("id"));
            row.add("play");
            data.add(row);
       }
       return data;
    }

    private static Vector<String> createColumnNames() {
        Vector<String> result = new Vector<String>(); 
        result.add("TestCase");
        result.add("");
        result.add("");
        result.add("");
        return result;
    }

    /**
     * overridden to ignore null values
     */
    @Override
    public void setValueAt(Object value, int row, int col) {
        if (value == null) {
            return;
        }
        // delegate to the parent method
        super.setValueAt(value, row, col);
    }
}
公共类TestcaseTableModel扩展了DefaultTableModel{
//这里没有矢量!!
公共TestcaseTableModel(元素testSuite){
//委托给父构造函数
super(createDataVector(testSuite),createColumnNames());
}
专用静态向量cr