3

Thareは、javaFXドキュメントページのチュートリアルです。この例では、特定のJavaクラスがある場合に、tableViewを作成する方法について説明します。これにより、どの列を作成するかがわかります。(これは、この例ではPersonクラスです)。

しかし、特定のクラスがなく、列の数が時々変わる可能性がある場合はどうなりますか?私の場合、私はそのようなデータ構造を持っています:

class TableData{ 
    List<Row> rows; //A list with all my rows i need to have in my table
}

class Row{
    List<Column> columns; //Cells\Columns for every row. 
}

class Column{
    Attribute attr; //Each column - is somethig like a wrapper for the real data i need to show in a cell;
}

class Attribute{ //My precues data
    String name;
    SupportingInfo info;
}

class SupportingInfo{//Some supporting fields...
    String name;
    String value;
    //...etc....
}

ですから、私の場合はこれと非常によく似ています。唯一の違いは、上記の場合のデータがjavaFXテーブルでの表現にバインドされていないことです(したがって、誰かがtableViewでこのデータを編集するための追加のコントロールを作成したとしても、そのデータを持つ実際のオブジェクトはそれを認識しません。 )、it(data)は、一部のオブジェクトではなく、一部の文字列のようにテーブルに移動するためです。

したがって、必要なのは、データをテーブルにプッシュし(table.setItems(tableData)など)、いくつかのセットファクトリを設定し、ユーザーがデータを編集できるようにし、この編集されたデータをtableDataオブジェクトに含めることです。

この目的のために作成しようとしたコードは次のとおりです。

//prepare my table
private void createTableHeader(TableView table, List<Attribute> ias) {
    int i = 0;
    for (final Attribute ia : ias) {
        final int j = i;
        i++;
        TableColumn tc = new TableColumn(ia.getName());
        tc.setSortable(true);
        tc.setCellValueFactory(new Callback<CellDataFeatures<List<Attribute>, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(CellDataFeatures<List<Attribute>, String> arg0) {
                if(arg0.getValue().get(j).getSupportingInfo() == null){
                    arg0.getValue().get(j).setSupportingInfo(new SupportingInfo());
                }
                return new SimpleObjectProperty(arg0.getValue().get(j),"value");
            }
        });
        table.getColumns().add(tc);
    }
}

//loading some data to my tableView
private void createTableBody(TableView curTable, List<Row> rows) {  
    ObservableList<List<Attribute>> data = FXCollections.observableArrayList();
    for (Row row : rows) {
        data.add(row.getColumns());
    }
    curTable.setItems(data);
}   

//this one is to define some extra controls for editing data in a table by users
private void makeCellFactory(TableColumn curTableCol, final Attribute templateIa, final Document doc) {
    curTableCol.setCellFactory(new Callback<TableColumn, TableCell>() {
        public TableCell call(TableColumn p) {
            final EditingCell cell = new EditingCell(templateIa, doc);
            return cell;
        }
    });
}       

しかし、その結果、テーブルに空の行があり、セルをクリックしてテーブル編集コントロールを受け取ることができます。ただし、テーブルごとにデフォルト値はありません。コードで何が間違っているのですか?

4

1 に答える 1

1

わかりました。解決策を見つけました。ts.setCellFactoryは次のようになります。

tc.setCellValueFactory(new Callback<CellDataFeatures<List<Attribute>, SupportingInfo>, ObservableValue<Attribute>>() {
 @Override
 public ObservableValue<Attribute> call(CellDataFeatures<List<Attribute>, SupportingInfo> arg0) {
  return new SimpleObjectProperty(arg0.getValue().get(j),"value",arg0.getValue().get(j));
 }
});

また、このコードは、新しい値をキャッチし、受信データをテーブルに配置するために必要です。

tc.setOnEditCommit(new EventHandler<CellEditEvent<List<Attribute>, Attribute>>() {
    @Override
    public void handle(CellEditEvent<List<Attribute>, Attribute> t) { t.getTableView().getItems().get(t.getTablePosition().getRow()).get(j).setSupportingInfo(t.getNewValue().getSupportingInfo());
    }
});
于 2012-09-30T08:12:45.137 に答える