2017-10-04 1 views
1

Mein Problem ist, ich zwei horizontale Bildlaufleisten haben, dass ich sie im Einklang bewegen wollen, und ich habe versucht mit:Synchronisieren von zwei Bildlaufleisten JavaFX

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

Das Problem ist, dass ich bar1 ‚s merken Der maximale Wert ist 1.0, während der maximale Wert bar2102.5 ist. Daher, das Problem, wenn ich scrollen bar2, bar1 bewegt sich viel aufgrund der großen Diskrepanz in ihrem Wert. Ich habe versucht, setMin, setMax, setUnitIncrement, setBlockIncrement vor dem Binden der Wert-Eigenschaft zu verwenden. Aber es funktioniert nicht.

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

bitte geben Sie ein lauffähiges Beispiel, der das Problem demonstriert (siehe https://stackoverflow.com/help/how-to-ask) – kleopatra

+1

auch „how to Erstelle ein [MCVE] ". –

+0

sieht aus wie die Skalierung ist anders: in scrollPane ist es auf max = 1.0 normalisiert, während in TableView ist es die rohen Pixel. Seltsamerweise kann der Wert auf einen beliebigen Wert gesetzt werden, aber beim aktuellen Scrollen zurückgesetzt werden: Wenn Sie also durch die Tabelle blättern, befindet sich der Bereich sofort an der oberen Grenze (1.0) und wenn Sie im Fenster blättern, ist die Tabelle sofort angezeigt untere Grenze (sehr nahe 0,0) – kleopatra

Antwort

1

Bidi-Bindung von Valueproperty einer Bildlaufleiste in einem scrollPane diejenigen eine Bildlaufleiste in einem tableview ist nicht möglich, weil das erstere normiert ist, während die letztere nicht der Fall ist. Stattdessen Änderungen hören und skalieren manuell, wie: siehe

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); 
    }); 
} 
Verwandte Themen