2012-09-20 14 views

答えて

1

これは現在考えられていません。 TableViewSkinは、VirtualFlowフィールドを持つVirtualContainerBaseから継承します。 VirtualFlowオブジェクトには、2つのVirtualScrollBarフィールドhbarとvbarがあります。私はそれに到達する方法を見ることができません。

興味深いことに、これはプライベートですが、TableViewにはプライベートcontentWidthフィールドもあります。私は、JFXチームが理解できないAPIをあまりにも多く開くことに非常に慎重であると確信しています。 contentWidthフィールドをJFX JIRAまたはopenjfx-devメーリングリストの機能リクエストとしてintプロパティとしてオープンするように要求することができます。

ストップギャップ指標は、テーブルビュー選択モデルの選択された項目またはインデックスプロパティをバインドすることです。

+0

ありがとう。否定的な回答を受け入れる習慣は何ですか?私はそれが本当に不可能かどうかは分かりません - それを証明することは確かに不可能です。少なくとも6日以上待つだろう。 –

5

外部のスクロールバーでTableviewをバインドするためのCSSハックを作成しました。 1つのスクロールバーが両方のテーブルビューを制御します。

私の考えの概要:

  • 2 tableviews
  • を作成して1つの垂直スクロールバーを作成します。 myScrollbarの値は、両方のテーブルビューのscrollTo(int)を呼び出して変更すると
  • )さんは、最小= 0、最大= TableView.Items.size(の大きさにmyScrollbarの最小値と最大値を設定し
  • この例ではmyScrollbarそれを呼ぶことにしましょうfunction
  • CSSで実装されたテーブルビューのネイティブの垂直スクロールバーを無効にします。

これは2つのテーブルを提供し、どちらも外部スクロールバー(myScrollbar)で制御されます。ここで

は、CSSを使用してテーブルビューのスクロールバーを非表示にするコードです:

/* The main scrollbar **track** CSS class */ 

.mytableview .scroll-bar:vertical .track{ 
     -fx-padding:0px; 
    -fx-background-color:transparent; 
    -fx-border-color:transparent; 
    -fx-background-radius: 0em; 
    -fx-border-radius:2em; 

} 

/* The increment and decrement button CSS class of scrollbar */ 

.mytableview .scroll-bar:vertical .increment-button , 
.mytableview .scroll-bar:vertical .decrement-button { 

    -fx-background-color:transparent; 
    -fx-background-radius: 0em; 
    -fx-padding:0 0 0 0; 
} 

.mytableview .scroll-bar:vertical .increment-arrow, 
.mytableview .scroll-bar:vertical .decrement-arrow 
{ 
    -fx-shape: " "; 
    -fx-padding:0;   
} 

/* The main scrollbar **thumb** CSS class which we drag every time (movable) */ 
.mytableview .scroll-bar:vertical .thumb { 
    -fx-background-color:transparent; 
    -fx-background-insets: 0, 0, 0; 
    -fx-background-radius: 2em; 
    -fx-padding:0px; 

} 

その後、我々は、スクロールバーを使って、テーブルビューをスクロールする方法を設定する必要があります。

scroll.setMax(100); //make sure the max is equal to the size of the table row data. 
scroll.setMin(0); 
scroll.valueProperty().addListener(new ChangeListener(){ 

    @Override 
    public void changed(ObservableValue ov, Number t, Number t1) { 
     //Scroll your tableview according to the table row index 
     table1.scrollTo(t1.intValue()); 
     table2.scrollTo(t1.intValue()); 
    } 

}); 

http://blog.ngopal.com.np/2012/09/25/how-to-bind-vertical-scroll-in-multi-tableview/

+0

ソリューションはすばらしく見えます。私はあなたに恩恵を与えるだろうスタックのオーバーフローでアーカイブされているように投稿としてそれを書いてください。 –

+0

thanks..and cheers :) – privatejava

1

私は問題を解決するために見つけた最も簡単な方法は、目に見えるのvalueProperty AN隠されたスクロールバーをバインドすることです。

// Application 
    private MyController controller; 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      FXMLLoader fxmlLoader = new FXMLLoader(SalesApp.class.getResource("scene.fxml")); 
      BorderPane root = (BorderPane) fxmlLoader.load();; 
      Scene scene = new Scene(root); 
      scene.getStylesheets().add(getClass().getResource("app.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show();    
controller = (MyController) fxmlLoader.getController(); 
      controller.setScrollBarBinding(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

今の表は、マウス、キー、またはスクロールバーを経由して同期的にスクロールする必要があります。

// Controller 
@FXML private TableView<MyBean> tableLeft; 
@FXML private TableView<MyBean> tableRight; 
@FXML private ScrollBar scrollBar; 


@SuppressWarnings("rawtypes") 
private void bindScrollBars(TableView<?> tableView1, TableView<?> tableView2, 
       ScrollBar scrollBar, Orientation orientation) { 

    // Get the scrollbar of first table 
    VirtualFlow vf = (VirtualFlow)tableView1.getChildrenUnmodifiable().get(1); 
    ScrollBar scrollBar1 = null; 
    for (final Node subNode: vf.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && 
       ((ScrollBar)subNode).getOrientation() == orientation) { 
      scrollBar1 = (ScrollBar)subNode; 
     } 
    } 

    // Get the scrollbar of second table 
    vf = (VirtualFlow)tableView2.getChildrenUnmodifiable().get(1); 
    ScrollBar scrollBar2 = null; 
    for (final Node subNode: vf.getChildrenUnmodifiable()) { 
     if (subNode instanceof ScrollBar && 
       ((ScrollBar)subNode).getOrientation() == orientation) { 
      scrollBar2 = (ScrollBar)subNode; 
     } 
    } 

    // Set min/max of visible scrollbar to min/max of a table scrollbar 
    scrollBar.setMin(scrollBar1.getMin()); 
    scrollBar.setMax(scrollBar1.getMax()); 

    // bind the hidden scrollbar valueProterty the visible scrollbar 
    scrollBar.valueProperty().bindBidirectional(scrollBar1.valueProperty()); 
    scrollBar.valueProperty().bindBidirectional(scrollBar2.valueProperty()); 
} 

/* 
* This method must be called in Application.start() after the stage is shown, 
* because the hidden scrollbars exist only when the tables are rendered 
*/ 
public void setScrollBarBinding() { 
    bindScrollBars(this.tableLeft, this.tableRight, this.scrollBar, Orientation.VERTICAL); 
} 

今、あなたはステージが表示され、テーブルがレンダリングされた後、アプリケーションからバインディングを呼び出す必要があります。

楽しんでください、オラフ

関連する問題