したがって、グリッドに追加されたときにコンポーネントに割り当てられた割合に基づいて、子ノートのサイズを変更して、GridPane に提供された使用可能なスペースを埋めることを目的として、GridPane を使用しています。私は同様の質問を見てSOに時間を費やしましたが、提案された解決策はどれもうまくいかないようで、私の要件に適合していないようです。基本的に、私はこのようなものと動的なサイズ変更が必要です:
CSSまたはコードのいずれかでボタンの最小、最大、および優先サイズのサイズを変更すると、それが可能になります。これで私が見つけたのは、ウィンドウのサイズが変更されるとボタンのサイズが少し変更されることですが、幅と高さの両方の最大値を非常に大きな値に設定しても、ボタンは上記のように残ります。下図のように画面全体を占めます。マゼンタの色は GridPane に適用され、それが存在する AnchorPane には適用されないことに注意してください。そのため、明らかにすべてのスペース自体を占めていますが、子に比例して割り当てているわけではありません。
CSS で指定された pref、min、max の寸法を取り出し、Java コードに setMaxSize 命令のみを残すと、ウィンドウはすべて小さく描画されます。以下に示すように。
以下は SCE です。(コードを最適化できることは知っていますが、単純で明確な例を意図しているだけです)。
JAVA: パッケージ アプリケーション;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = new BorderPane();
Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
ButtonPanel2 bp = new ButtonPanel2();
root.setCenter(bp);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}//end start
public static void main(String[] args) {
launch(args);
}//end main
}//end class main
class ButtonPanel2 extends AnchorPane {
GridPane grid;
Button ba, bb, bc, bd;
/**Construct a new button panel object.**/
public ButtonPanel2(){
//Create Grid and gaps
grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.prefWidthProperty().bind(this.widthProperty());
grid.getStyleClass().add("test");
//Init buttons
ba = new Button("A");
bb = new Button("B");
bc = new Button("C");
bd = new Button("D");
//Apply CSS styles for size
ba.getStyleClass().add("button1");
bb.getStyleClass().add("buttonH2");
bc.getStyleClass().add("buttonV2");
bd.getStyleClass().add("button2");
ba.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
bb.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
bc.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
bd.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
//Add items to grid.
//Node, colIndex, rowIndex, colSpan, rowSpan
grid.add(ba,0,0,1,1);//
grid.add(bb,1,0,2,1);//
grid.add(bc,0,1,1,2);//
grid.add(bd,1,1,2,2);//
GridPane.setFillHeight(ba, true);
GridPane.setFillHeight(bb, true);
GridPane.setFillHeight(bc, true);
GridPane.setFillHeight(bd, true);
GridPane.setFillWidth(ba, true);
GridPane.setFillWidth(bb, true);
GridPane.setFillWidth(bc, true);
GridPane.setFillWidth(bd, true);
//anchor grid to parent container (anchor)
AnchorPane.setTopAnchor(grid, 0.0);
AnchorPane.setBottomAnchor(grid, 0.0);
AnchorPane.setLeftAnchor(grid, 0.0);
AnchorPane.setRightAnchor(grid, 0.0);
this.getChildren().add(grid);
this.getStyleClass().add("test");
}//end buttonPanel2
}//end buttonPanel2
CSS:
.buttonV2{
-fx-min-width: 50px;
-fx-min-height:100px;
-fx-max-width: 200px;
-fx-max-height:100px;
-fx-pref-width: 75px;
-fx-pref-height:150px;
}
.buttonH2{
-fx-min-width: 100px;
-fx-min-height:50px;
-fx-max-width: 200px;
-fx-max-height:100px;
-fx-pref-width: 150px;
-fx-pref-height:75px;
}
.button1 {
-fx-min-width: 50px;
-fx-min-height:50px;
-fx-max-width: 100px;
-fx-max-height:100px;
-fx-pref-width: 75px;
-fx-pref-height:75px;
}
.button2 {
-fx-min-width: 100px;
-fx-min-height:100px;
-fx-max-width: 200px;
-fx-max-height:200px;
-fx-pref-width: 150px;
-fx-pref-height:150px;
}
.test{
-fx-background-color: #ff00ff;
}
.test2{
-fx-background-color: #00ffff;
}