gpt4 book ai didi

java - JTable 数据滚动后才显示?

转载 作者:行者123 更新时间:2023-12-01 23:42:22 25 4
gpt4 key购买 nike

我在 ScrollPane 中有一个 JTable,其中包含来自扩展 DefaultTableModel 的数据。当我将数据加载到表中时,它会显示列。滚动条显示数据在那里,但它没有显示。一旦我滚动,数据就会显示出来。我在模型上尝试了各种 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();

}

测试用例表模型

    package gui.table;
import java.util.List;
import java.util.Vector;

import javax.swing.table.DefaultTableModel;

import org.jdom2.Element;

@SuppressWarnings("serial")
public class TestcaseTableModel extends DefaultTableModel {

String[] columnNames = { "Testcase" };
Vector<String[]> row_data = new Vector<String[]>();

public TestcaseTableModel(Element testSuite) {

row_data.clear();
List<Element> testcase_list = testSuite.getChildren("TestCase");
String[] data;


for (int i = 0; i < testcase_list.size(); i++) {

data = new String[4];
data[0] = "";
data[1] = "failed";
data[2] = testcase_list.get(i).getAttributeValue("id");
data[3] = "play";
row_data.add(data);

}

}

@Override
public void setValueAt(Object value, int row, int col) {

// Output gui NULL exception
if (value == null)
return;

row_data.elementAt(row)[col] = value.toString();

fireTableCellUpdated(row, col);
}

@Override
public int getColumnCount() {
return columnNames.length;
}

@Override
public int getRowCount() {
return row_data == null ? 0 : row_data.size();
}

@Override
public String getValueAt(int row, int col) {
return row_data.elementAt(row)[col];
}

public String getColumnName(int column) {
return columnNames[column];
}

public void clear(){
row_data.clear();
fireTableDataChanged();
}
}

感谢您的任何想法。

最佳答案

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

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

要么您想要自己的数据结构来存储数据和列名称,并且您应该扩展AbstractTableModel。或者您想使用 DefaultTableModel,但您不能拥有自己的数据结构,因为 DefaultTableModel 已经定义了自己的数据结构。除了 getColumnClass() 之外,您不应重写 DefaultTableModel 的任何方法。如果您这样做,或者添加方法,那么这些方法应始终委托(delegate)给 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);
}
}

关于java - JTable 数据滚动后才显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17718003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com