2017-08-24 7 views
1

テーブルの作成後にネストされた列を動的に追加すると、nested column headersはレンダリングされません。ここで問題を再現するコードです。私はJDK 1.8.0_121を使用していますJava FX動的に追加されたネストされた列ヘッダーはレンダリングされません

しかし、ネストした列をインラインで追加すると、すべてが期待通りに表示されます。

package hellofx; 

import javafx.application.*; 
import javafx.application.*; 
import javafx.geometry.*; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.scene.text.*; 
import javafx.stage.*; 

public class TableViewSample extends Application { 

private TreeTableView table = new TreeTableView(); 

public static void main(String[] args) { 
    launch(args); 
} 

@Override 
public void start(Stage stage) { 
    Scene scene = new Scene(new Group()); 
    stage.setTitle("Table View Sample"); 
    stage.setWidth(600); 
    stage.setHeight(500); 

    final Label label = new Label("Address Book"); 
    label.setFont(new Font("Arial", 20)); 

    table.setEditable(true); 

    TreeTableColumn firstNameCol = new TreeTableColumn("First Name"); 
    TreeTableColumn lastNameCol = new TreeTableColumn("Last Name"); 
    TreeTableColumn emailCol = new TreeTableColumn("Email"); 

    //Simulate adding nested columns after stage is set. 
    Platform.runLater(() -> { 
     TreeTableColumn firstEmailCol = new TreeTableColumn("Primary"); 
     TreeTableColumn secondEmailCol = new TreeTableColumn("Secondary"); 

     emailCol.getColumns().addAll(firstEmailCol, secondEmailCol); 
    }); 
    table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); 

    final VBox vbox = new VBox(); 
    vbox.setSpacing(5); 
    vbox.setPadding(new Insets(10, 0, 0, 10)); 
    vbox.getChildren().addAll(label, table); 

    ((Group) scene.getRoot()).getChildren().addAll(vbox); 

    stage.setScene(scene); 
    stage.show(); 
} 
} 
+0

「スリープ(100)」は、あなたが思っていることをしません。イベントが発生するのを待つことはありません。むしろ、イベントが処理されるのを一時的に防止します。あなたの目標が、ステージが表示された後に何かを起こすことであるならば、 'stage.setOnShown'を使います。 – VGR

+0

@VGRもちろん、正しいです。しかし、代わりに遅延を作成するために 'PauseTransition'を使用してOPのコードをテストしましたが、その方法でも動作しません。テーブルヘッダーが高さを再計算できないか、何らかの形でレイアウトに失敗するように見えます。 –

+0

ネストされた列の数は、表のレンダリング時にはわかりません。入力されるフィードによって、列が変更されます。その遅れはデモンストレーションの目的に過ぎない。このコードを実行させるのは現実世界のイベントになります。 –

答えて

0

ここで私の回避策があります。

テーブルを作成するときに、ダミー列をインラインで追加します。

emailCol.getColumns().add(new TreeTableColumn("DummyColumn")); 

後で実際の列を追加しながら削除します。

emailCol.getColumns().remove(0) 
関連する問題