2013-07-10 18 views
38

Mam BorderPane z elementem ScrollPane jako elementem środkowym. Zmienia rozmiar automatycznie, aby wypełnić ekran. Wewnątrz ScrollPane jest HBox, który nie ma zawartości, ale jest obiektem typu "przeciągnij i upuść". Dlatego chcę, aby wypełnił swojego rodzica ScrollPane.Jak zmienić rozmiar zawartości JavaFX ScrollPane na bieżący rozmiar?

Jaki jest preferowany sposób na zrobienie tego?

To, co próbowałem do tej pory, jest przesłonięcie metody ScrollPane.resize(...), aby zmienić rozmiar HBox, ale wydaje się dość skomplikowane i niekonwencjonalne.

edit: Aby dodać kilka przydatnych kod do tego, to w jaki sposób można obejść ten problem, ale wierzę, że musi być jakiś lepszy sposób to zrobić:

@Override 
public void resize(double width, double height) { 
    super.resize(width, height); 

    double scrollBarHeight = 2; 
    double scrollBarWidth = 2; 

    for (final Node node : lookupAll(".scroll-bar")) { 
     if (node instanceof ScrollBar) { 
      ScrollBar sb = (ScrollBar) node; 
      if (sb.getOrientation() == Orientation.HORIZONTAL) { 
       System.out.println("horizontal scrollbar visible = " + sb.isVisible()); 
       System.out.println("width = " + sb.getWidth()); 
       System.out.println("height = " + sb.getHeight()); 
       if(sb.isVisible()){ 
        scrollBarHeight = sb.getHeight(); 
       } 
      } 
      if (sb.getOrientation() == Orientation.VERTICAL) { 
       System.out.println("vertical scrollbar visible = " + sb.isVisible()); 
       System.out.println("width = " + sb.getWidth()); 
       System.out.println("height = " + sb.getHeight()); 
       if(sb.isVisible()){ 
        scrollBarWidth = sb.getWidth(); 
       } 
      } 
     } 
    } 

    hBox.setPrefSize(width-scrollBarWidth, height-scrollBarHeight); 
} 

kod częściowo zaczerpnięte z tutaj: How to access the Scrollbars of a ScrollPane

+0

Jest ok, ja po prostu umieścić hgrow i vgrow czasami i to działa teraz – user7867610

Odpowiedz

62

Spróbuj

ScrollPane scrollPane = new ScrollPane(); 
scrollPane.setFitToHeight(true); 
scrollPane.setFitToWidth(true); 

bez przesłanianie metody resize().

+1

Tak jak myślałem, musiał istnieć oczywisty sposób, którego po prostu nie znalazłem. Wielkie dzięki za odpowiedź! – Lennert

+0

Jaka jest metoda dostępu dla setFitToHeight i setFitToWidth w xml? – Andrew121007

+6

@ Andrew121007 to "' –

17

Ustawienie atrybutu fitToHeight lub fitToWidth przez XML lub CSS:

FXML:

<ScrollPane fx:id="myScrollPane" fitToHeight="true" fitToWidth="true" /> 

CSS:

+0

Lubię używać ScrollPane zamiast czegoś podobnego do .my-scroll-pane, aby wszystko było automatyczne, nie Konieczne zmiany FXML to prawdopodobnie powinna być domyślna. – User

+0

@Manius to prawda, ale powinieneś być ostrożny, aby zrobić to dokładnie, w przeciwnym razie wszystkie twoje tafle przewijania zachowują się tak samo i prawdopodobnie nie chcesz tego. – NDY

+0

Chciałbym dodać, że ta opcja jest dostępna w programie Scene Builder. W dowolnym okienku przewijania w obszarze "layout" -> "Specific" (drugi od góry) -> Dopasuj do szerokości/wysokości. Zajęło mi trochę czasu, aby znaleźć miejmy nadzieję, że to pomaga komuś. –