2017-10-04 8 views
1
2つのスクロールバーの同期

私の問題は、私は、私は彼らが一斉にスクロールしたいと私は使用して試した二つの水平スクロールバーを持っている:JavaFXの

bar1.valueProperty().bindBidirectional(bar2.valueProperty());

問題は、私はbar1年代に気づくことです最大値は1.0で、bar2の最大値は102.5です。したがって、問題は、私がスクロールbar2bar1は、その値の大きな不一致のために多くを移動します。私は、setMin,setMaxsetUnitIncrementsetBlockIncrementを使って、valueプロパティをバインドしようとしました。しかし、動作しません。後者はない前者を正規化するため

public class DynamicTableView extends Application { 
    private Scene scene; 
    private VBox root; 
    private ScrollPane scPane; 
    private static final int N_COLS = 10; 
    private static final int N_ROWS = 10; 
    private Button button; 

    public void start(Stage stage) throws Exception { 

     root = new VBox(); 
     scPane = new ScrollPane(); 
     Label lbl = new Label("Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table"); 
     scPane.setContent(lbl); 

     root.getChildren().add(scPane); 

     TestDataGenerator dataGenerator = new TestDataGenerator(); 

     TableView<ObservableList<String>> tableView = new TableView<>(); 

     // add columns 
     List<String> columnNames = dataGenerator.getNext(N_COLS); 
     for (int i = 0; i < columnNames.size(); i++) { 
      final int finalIdx = i; 
      TableColumn<ObservableList<String>, String> column = new TableColumn<>(
        columnNames.get(i) 
      ); 
      column.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))); 
      tableView.getColumns().add(column); 
     } 

     // add data 
     for (int i = 0; i < N_ROWS; i++) { 
      tableView.getItems().add(
        FXCollections.observableArrayList(
          dataGenerator.getNext(N_COLS) 
        ) 
      ); 
     } 

     root.getChildren().add(tableView); 

     tableView.setPrefHeight(200); 

     button = new Button("Delete"); 
     button.setOnAction(event -> { tableView.getItems().clear();}); 

     root.getChildren().add(button); 

     Scene scene = new Scene(root, 600, 600); 
     stage.setScene(scene); 
     stage.show(); 

     for(Node node1: scPane.lookupAll(".scroll-bar")) 
     { 
      if(node1 instanceof ScrollBar) 
      { 
       ScrollBar scrollBar1 = (ScrollBar)node1; 
       if(scrollBar1.getOrientation() == Orientation.HORIZONTAL) 
       { 
        for(Node node2: tableView.lookupAll(".scroll-bar")) 
        { 
         if(node2 instanceof ScrollBar) 
         { 
          ScrollBar scrollBar2 = (ScrollBar)node2; 
          if(scrollBar2.getOrientation() == Orientation.HORIZONTAL) 
          { 
           scrollBar2.valueProperty().bindBidirectional(scrollBar1.valueProperty()); 
           break; 
          } 
         } 
        } 
       } 
      } 
     } 

    } 

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

    private static class TestDataGenerator { 
     private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" "); 

     private int curWord = 0; 

     List<String> getNext(int nWords) { 
      List<String> words = new ArrayList<>(); 

      for (int i = 0; i < nWords; i++) { 
       if (curWord == Integer.MAX_VALUE) { 
        curWord = 0; 
       } 

       words.add(LOREM[curWord % LOREM.length]); 
       curWord++; 
      } 

      return words; 
     } 
    } 
} 
+1

問題を示し、実行可能な例を提供してください(https://stackoverflow.com/help/how-to-askを参照) – kleopatra

+1

をどのようにも」を参照してください。 [MCVE]を作成してください。 –

+0

はスケーリングが異なっているようです:scrollPaneではmax = 1.0に正規化され、tableViewでは生のピクセルです。奇妙なことに、値は任意の値に設定することができますが、実際のスクロールではリセットされます:したがって、テーブルをスクロールすると、そのウィンドウの上限(1.0)になり、ペインをスクロールするとすぐに下限(非常に0.0に近い) – kleopatra

答えて

1

のtableViewにスクロールバーとスクロールにスクロールバーのvaluePropertyの双方向結合性は不可能です。代わりに、変更内容を聞くなど、手動でスケール:

protected void bindScrollBarValues(ScrollBar scrollBarInTable, ScrollBar scrollBarInPane) { 
    // can't use bidi-binding because bar in scrollPane is normalized, bar in table is not 
    // scrollBarInTable.valueProperty().bindBidirectional(scrollBarInPane.valueProperty()); 
    // scale manually 
    scrollBarInTable.valueProperty().addListener((src, ov, nv) -> { 
     double tableMax = scrollBarInTable.getMax(); 
     scrollBarInPane.setValue(nv.doubleValue()/tableMax); 
    }); 

    scrollBarInPane.valueProperty().addListener((src, ov, nv) -> { 
     double tableMax = scrollBarInTable.getMax(); 
     scrollBarInTable.setValue(nv.doubleValue() * tableMax); 
    }); 
}