0
votes

I have a JTable in a ScrollPane containinig data from extended DefaultTableModel. When I load the data into the Table it shows the columns. The Scrollbar shows the data is there but it does not show it. As soon as I scroll the data shows up. I tried all sort of fire() events on the model and .repaint(), .revalidate etc. on the Jtable but cann“t get it working. Apperantely the CellRenderer is not called. How can I resolve this?

    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();

        }

TestcaseTableModel

    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();
    }
}

Thanks for any ideas.

2
The strange thing is later in the code it loads the Table fine.. - Hans En
For better help sooner, post an SSCCE. - Andrew Thompson

2 Answers

3
votes

You're extending DefaultTableModel. DefaultTableModel already stores the column names and data in its own vectors. All its methods look for the data in DefaultTableModel's vectors.

Your subclass recreates another vector to store the data. That can't possibly work: the base class methods don't know and care about this new vector.

Either you want your own data structure to store the data and column names, and you should extend AbstractTableModel. Or you want to use DefaultTableModel, and you can't have your own data structure, since DefaultTableModel already defines its own. Except for getColumnClass(), you should not override any method of DefaultTableModel. If you do, or if you add methods, then these methods should always delegate to methods from DefaultTableModel.

For example:

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);
    }
}
0
votes

table.setVisible(true) solved the Problem thanks for your suggestions happy to learn.