Hi,

I am trying to show a ScrollPane resized so that the full width of its content is visible: no horizontal scrolling, no clipping, no content resizing. Only vertical scrolling if necessary.

Seems as if prefViewportWidth should do the trick. Since I don't want to hardcode some width I am binding it to the prefWidth of the scrollpane content.

Problem: this works only if the content prefWidth is set explicitly. If it is -1, prefViewportWidth is also -1 (because it is bound) and that computes a value too small to fit the (computed) prefWidth of the content, leading to a horizontal scrollbar. Is this a bug, or am I supposed to do this differently?

Here is a test case. It only works if vb.prefWidth is set explicitly at the end. Which of course is not a dynamic value...

public class PrefViewportTest extends Application
{
  public static void main(String[] args) { Application.launch(args); }

  @Override
  public void start(Stage primaryStage) throws Exception
  {
    // Scene -> HBox -> ScrollPane -> VBox -> Label
    Label l = new Label("some boring not too short text");
    VBox vb = new VBox();
    vb.getChildren().add(l);
    ScrollPane sp = new ScrollPane();
    sp.setContent(vb);
    sp.prefViewportWidthProperty().bind(vb.prefWidthProperty());
    HBox hb = new HBox();
    hb.getChildren().add(sp);
    primaryStage.setScene(new Scene(hb, 300, 200));
    primaryStage.show();
    System.out.println("before: " + vb.getPrefWidth()); // prints -1.0
    vb.setPrefWidth(vb.prefWidth(-1));
    System.out.println("after: " + vb.getPrefWidth()); // prints 164.0
  }
}

Rgds
Werner

Reply via email to