0

拡張された DefaultTableModel からのデータを含む ScrollPane に JTable があります。データをテーブルにロードすると、列が表示されます。スクロールバーはデータがそこにあることを示していますが、表示されていません。スクロールするとすぐにデータが表示されます。モデルであらゆる種類の 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();
    }
}

アイデアをありがとう。

4

2 に答える 2

3

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);
    }
}
于 2013-07-18T08:30:48.133 に答える
0

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

于 2013-07-18T09:03:32.547 に答える