2016-08-15 5 views
0

私はScrollPaneでGUIアプリケーションを作成していますが、サイズ変更に問題がありました。私は、次の例に不可欠なコードを抽出:JavaFX ScrollPane [setPrefSize、setMinSize、setMaxSize]が動作しません

import javafx.application.Application; 
import javafx.geometry.Bounds; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.stage.Stage; 
import javafx.scene.layout.VBox; 
import javafx.scene.control.ScrollPane; 

public class JavaFXExample extends Application { 

    final int width = 300; 
    final int height = 300; 

    @Override 
    public void start(Stage primaryStage) { 

     Button b = new Button("This should be at the bottom!"); 

     //this vbox goes inside the scrollpane 
     VBox boxInScrollPane = new VBox(10); 
     boxInScrollPane.setAlignment(Pos.BOTTOM_CENTER); 
     boxInScrollPane.getChildren().add(b); 

     //main content 
     ScrollPane scrollPane = new ScrollPane(); 
     scrollPane.setContent(boxInScrollPane); 
     scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); 
     scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); 

     //Doesn't do anything! 
     scrollPane.setPrefSize(100, 100); 
     scrollPane.setMaxSize(100, 100); 
     scrollPane.setMinSize(100, 100); 

     Scene scene = new Scene(scrollPane, width, height); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 


     //set size of boxInScrollPane to be equal to the viewport 
     Bounds viewportBounds = scrollPane.getViewportBounds(); 
     double innerWidth = viewportBounds.getMaxX() - viewportBounds.getMinX(); 
     double innerHeight = viewportBounds.getMaxY() - viewportBounds.getMinY(); 
     System.out.println(innerWidth + " " + innerHeight); 
     boxInScrollPane.setPrefSize(innerWidth, innerHeight); 

    } 

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

} 

だから私はボタンが含まれているのVBoxが、含まれているのScrollPaneを含むウィンドウを、持っています。ここの例では、スクロールペインのサイズを300x300pxのウィンドウで100x100pxに変更していますが、これは任意です。重要なのは、このコードを実行すると、ウィンドウ全体を塗りつぶすスクロールペインが表示されることです。ここに私の出力です:

はここで何が起こっているの?

答えて

1

シーンのルートは、シーンの最小/プレフィックス/最大サイズに関係なく、シーン全体を満たす大きさになっています。 ScrollPaneを幅100ピクセル、高さ100ピクセルのままにしたい場合は、それを別のコンテナにラップしてください(ほとんどのコンテナが行います)。容器は、次にサイズ変更されますが、ScrollPaneは、レイアウトサイズを尊重する:

Scene scene = new Scene(new StackPane(scrollPane), width, height); 

デフォルトStackPaneは、その内容を中心ので、これは

enter image description here

もたらします
1

ソリューション:シーンconstuctorドキュメントから

Pane pane = new Pane(scrollPane); 
Scene scene = new Scene(pane, width, height); 

primaryStage.setScene(scene); 

primaryStage.show(); 

は、特定のサイズで特定のルート・ノードのためのシーンを作成します。

スクロールペインをルートノードとして設定すると、コンストラクタで指定されたサイズにサイズ変更され、前の設定が機能しなくなります。

解決方法は、ScrollPaneが自分のルールになるようにサイズ変更される単純なペインを作成することです。

関連する問題