1

JTable があり、jTable1.getModel()).getDataVector() を使用すると、異なる列のオブジェクトの型が異なります (私の場合はすべて String である必要があります)。

私のテーブルには 5 つの列があります。

  1. 数値(実際には文字列ですが、解析には問題ありません)

  2. セルに添付されたコンボボックスから選択された文字列ですが、そこから値を取得したい場合、文字列ではなくベクトルのように見えます

  3. 再び番号(0列のように-ここでは問題ありません)

  4. 再びコンボボックス付きの文字列ですが、文字列値が得られるので問題ありません

  5. 数値(文字列に隠されています)ですが、これも文字列である必要がありますが、ベクトルです

セルにコンボボックスを作成する方法 (列 1 と 3):

    TableColumn column = jTable1.getColumnModel().getColumn(3);
    JComboBox cb = new JComboBox(ServerIntf.DataModificationType.getStringList().toArray());
    column.setCellEditor(new DefaultCellEditor(cb));

テーブルモデルの作成方法:

   public TableModel getTableModel() {
    Vector<Vector<String>> data = task.getDataSet(dataName);
    ServerIntf.SimpleDataType sdt = Manager.manager.getSimpleDataType(task, dataName);
    rowsMin = sdt.getRowMin();
    rowsMax = sdt.getRowMax();
    columnsMin = sdt.getColMin();
    columnsMax = sdt.getColMax();
    if (data != null) {
        //nothing important here, it doeasn't come into this part anyway
    }
    int cmax = 5;
    int rmax = 1;
    Vector columns = new Vector(cmax);
    columns.addAll(Arrays.asList(new String[]{"ID", "Przekształcenie", "Ile razy", "Co z danymi", "Co dalej"}));

    return new DefaultTableModel(columns, rmax);
}

そして、これは私がデータを読む方法です:

  public AlgorythmTable(List get) {
    steps = new Vector<Step>();
    for (List<String> row : (List<List<String>>) get) {
        steps.add(new Step(row));
    }
    //boring here
}
  //...
    public Step(List list) {
        id = Integer.parseInt((String) list.get(0));
        matrix = ((String) ((Vector) list.get(1)).get(0)).isEmpty() ? null : ((String) ((Vector) list.get(1)).get(0));
        count = ((String) list.get(2))==null || ((String) list.get(2)).isEmpty() ? 0 : Integer.parseInt((String) list.get(2));
        after = ((String) list.get(3)).isEmpty() ? null : ServerIntf.DataModificationType.getByName((String) list.get(3));
        nextStep = ((String) list.get(4))==null || ((String) list.get(4)).isEmpty() ? -1 : Integer.parseInt(((String) list.get(1)));
    }

最後の行で CastException を取得します (nextStep = ...)

  Exception occurred during event dispatching:
  java.lang.ClassCastException: java.util.Vector cannot be cast to java.lang.String

行 (matrix = ...) で同じ例外が発生していましたが、ご覧のとおり、別の方法でキャストしたため、正常に動作しているようです。最初は問題がセル内のコンボボックスに関連していると思っていましたが、ユーザーが挿入した単純な文字列がある列でも発生します。

単純に別のキャストを行うことができますが、それがなくても機能するはずなので (さまざまな種類の JTable でその問題はありませんでした)、コードが読みにくくなり、このテーブルをより多くの列で拡張したい場合は、気になります。 (近い将来に起こるかもしれません)そして私は同じ問題に再び苦労します.

なぜそれがそのように機能するのか、そしてjtable(またはモデル)に統一された形式でセルの値を与えるように強制する方法があるかどうか、誰にもわかりませんか?

4

1 に答える 1

1

テーブルモデルの作成で提案されているようList<List<String>>に、を強制する代わりに、DefaultTableModelを拡張する方が保守しやすい場合があります。特に、オーバーライドして各データの正確なタイプを指定します。これには、いくつかのデフォルトのエディターとレンダラーを有効にするという直接的な利点があります。ここに関連する例があります。AbstractTableModelgetColumnClass()

于 2011-03-25T00:38:47.683 に答える