2017-01-20 7 views
1

私のデータがdouble[][]のような2次元配列のJavaFXでシンプルなTableViewを作成したいのですが、これをどのように達成できるのか、いくつかのアドバイスはありますか?JavaFXでTableViewに単純なダブルマトリックスをプロットする方法は?

+1

'new TableView ()' ??? – fabian

+0

はい、しかし、どのように配列2DをtableViewに挿入できますか?私の行列は4つの列と150の行を持っています –

答えて

3

ファビアンはコメントで示唆したよう:

TableView<double[]> 
  • は(double[][]から要素を抽出し、追加テーブルにアイテムとしてごdouble[][]配列の要素を追加しますよう

    1. は、あなたのテーブルを定義します。それらをObservableList<double[]>に)。

    2. 表の列を作成し、それぞれにセル値ファクトリーを提供します。

      col.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()[c])) 
      

      ここで、cは列インデックスである。

    3. セル項目をフォーマットする必要がある場合は、cell factoryも指定します。

    matrix

    import javafx.application.Application; 
    import javafx.beans.property.ReadOnlyObjectWrapper; 
    import javafx.collections.FXCollections; 
    import javafx.collections.ObservableList; 
    import javafx.scene.Scene; 
    import javafx.scene.control.TableColumn; 
    import javafx.scene.control.TableView; 
    import javafx.stage.Stage; 
    
    import java.util.List; 
    import java.util.Random; 
    import java.util.stream.Collectors; 
    import java.util.stream.IntStream; 
    
    public class MatrixTable extends Application { 
        private Random random = new Random(42); 
        private static final int N_COLS = 4; 
        private static final int N_ROWS = 100; 
        private static final int MAX_DATA_VALUE = 100; 
    
        public static void main(String[] args) { 
         launch(args); 
        } 
    
        @Override 
        public void start(Stage stage) { 
         ObservableList<double[]> data = generateData(); 
    
         TableView<double[]> table = new TableView<>(data); 
         table.getColumns().setAll(createColumns()); 
         table.setPrefSize(200, 250); 
    
         stage.setScene(new Scene(table)); 
         stage.show(); 
        } 
    
        private ObservableList<double[]> generateData() { 
         return FXCollections.observableArrayList(
           IntStream.range(0, N_ROWS) 
             .mapToObj(r -> 
               IntStream.range(0, N_COLS) 
                 .mapToDouble(c -> randomValue()) 
                 .toArray() 
             ).collect(Collectors.toList()) 
         ); 
        } 
    
        private List<TableColumn<double[], Double>> createColumns() { 
         return IntStream.range(0, N_COLS) 
           .mapToObj(this::createColumn) 
           .collect(Collectors.toList()); 
        } 
    
        private TableColumn<double[], Double> createColumn(int c) { 
         TableColumn<double[], Double> col = new TableColumn<>("C" + (c + 1)); 
         col.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()[c])); 
    
         return col; 
        } 
    
        private long randomValue() { 
         return Math.round(random.nextDouble() * MAX_DATA_VALUE * 100)/100.0; 
        } 
    } 
    

    あなたは私にこのラインのコードを説明できますか? javadocから

    col.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()[c])) 
    

    セル値の工場は、単一のTableColumn内のすべてのセルを移入する方法を指定するように設定する必要があります。セル値ファクトリは、TableColumn.CellDataFeaturesインスタンスを提供するCallbackであり、ObservableValueが返されることを想定しています。

    それでは、それは(param.getValue()によって提供された)行のデータのdouble[]配列から列のデータを抽出する方法を定義して行っています。データ値の周りにReadOnlyObjectWrapperを使用しているので、テーブルセルを編集可能にした場合(このサンプルでは行っていない)、編集した値を配列に書き戻しません。ラッパーは、ダブルデータ値をObservableValueに変換するために必要です(セルファクトリインターフェイスの必要に応じて)。

    ええ、それは混乱していることはわかっていますが、それはテーブルビューが効率的に何百万ものデータアイテムによってvirtualized controlsに裏打ちされるのを待っています。 TableViewの仮想化機能やその他の機能が必要ない場合は、代わりにGridPaneのラベルを使用することができます。

  • +0

    あなたのソリューションが私を助けてくれてありがとう! コードを見て、私は単純な[解決策](http://pastebin.com/WHyxTs4a)(私はJavaの初心者の開発者です)では、double []のようなArrayList を使用しています。 この回線コードを教えてもらえますか? 'col.setCellValueFactory(param - >新しいReadOnlyObjectWrapper <>(param.getValue()[c]))' –

    関連する問題