2013-07-10 9 views
38

Ich habe ein BorderPane mit einem ScrollPane als das zentrale Element. Die Größe wird automatisch angepasst, um den Bildschirm zu füllen. Innerhalb der ScrollPane ist eine HBox, die keinen Inhalt hat, aber ein Drag-and-Drop-Ziel ist. Deshalb möchte ich, dass es seinen Elternteil ScrollPane füllt.So passen Sie den JavaFX ScrollPane-Inhalt an die aktuelle Größe an

Was ist der bevorzugte Weg, dies zu tun?

Was ich bisher versucht habe, überschreibt die ScrollPane.resize(...) Methode, um die HBox Größe zu ändern, aber es scheint ziemlich kompliziert und unorthodox.

bearbeiten: Um einigen nützlichen Code dieses hinzufügen, das ist, wie ich das Problem umgehen kann, aber ich glaube, es gibt einigen besseren Weg sein muss, dies zu tun:

@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); 
} 

-Code teilweise von hier genommen: How to access the Scrollbars of a ScrollPane

+0

Es ist ok, ich habe nur eine hgrow und vgrow manchmal und es funktioniert jetzt – user7867610

Antwort

62

Versuchen

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

ohne die resize() Methode überschrieben.

+1

Genau wie ich dachte, musste es den offensichtlichen Weg geben, den ich gerade nicht gefunden habe. Vielen Dank für Ihre Antwort! – Lennert

+0

Was ist die Zugriffsmethode für SetFitToHeight und SetFitToWidth in XML? – Andrew121007

+6

@ Andrew121007 es ist '' –

17

Einstellen des fitToHeight oder fitToWidth Attribut durch XML oder CSS:

FXML:

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

CSS:

+0

Ich mag ScrollPane anstelle von etwas wie .my-Scroll-Scheibe, um die ganze Sache automatisch zu machen, nein FXML-Änderungen benötigt dann .. sollte wahrscheinlich ein Standard sein. – User

+0

@Manius das ist wahr, aber Sie sollten vorsichtig sein, dass Sie es spezifisch machen, sonst verhalten sich alle Ihre Scroll-Fenster genauso und wahrscheinlich wollen Sie das nicht. – NDY

+0

Ich möchte hinzufügen, dass diese Option in Scene Builder verfügbar ist. In jedem Scroll-Bereich unter "Layout" -> "Spezifisch" (zweite von oben) -> An Breite/Höhe anpassen. Nahm mich eine Weile, um zu finden, hoffentlich hilft das jemandem. –

Verwandte Themen