FXMLファイルが1つしかないJavaFXアプリケーションがあります。このファイルには、内部にStackPaneがあるAnchorPaneが1つあります。スクリーンショットは次のとおりです。
このアプリケーションを起動するときに、AnchorPaneを使用してStackPaneのサイズを自動的に変更します。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example; StackPaneは、現在使用可能な幅と高さを自動的に取得します。アプリケーションのサイズを変更すると、AnchorPaneは自動的にサイズ変更されますが、StackPaneは固定サイズのままです。
StackPaneのサイズを自動的に変更し、親パネル内で完全に引き伸ばすにはどうすればよいですか?
マイコード
Main.Java
package app;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
Scene scene = new Scene(root,800,600);
scene.getStylesheets().add(this.getClass().getResource("/app/style1.css").toExternalForm());
stage.setScene(scene);
stage.show();
}
}
MainController.Java
package app;
import Java.net.URL;
import Java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
public class MainController implements Initializable {
@FXML
private AnchorPane anchorPane;
@FXML
private StackPane stackPane;
@Override
public void initialize(URL url, ResourceBundle rb) {
stackPane.setPrefSize(anchorPane.getPrefWidth(), anchorPane.getPrefHeight()); //didn't work
}
}
Main.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import Java.lang.*?>
<?import Java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane fx:id="anchorPane" xmlns:fx="http://javafx.com/fxml" fx:controller="app.MainController">
<StackPane fx:id="stackPane" ></StackPane>
</AnchorPane>
style1.css
#anchorPane {
-fx-border-width: 2px;
-fx-border-color: chartreuse;
}
#stackPane {
-fx-border-width: 2px;
-fx-border-color: red;
/* didn't work */
-fx-hgap: 100%;
-fx-vgap: 100%;
}
数時間の検索とテストの後、質問を投稿した直後にようやく入手できました!
「AnchorPane.topAnchor、AnchorPane.bottomAnchor、AnchorPane.leftAnchor、AnchorPane.rightAnchorを使用できます。 AnchorPane内の子要素をフィット/ストレッチ/アラインする値「0.0」のfxmlコマンド。そのため、これらのコマンドは、サイズ変更中に親に従うように子要素に指示します。
更新されたコードMain.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import Java.lang.*?>
<?import Java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane fx:id="anchorPane" xmlns:fx="http://javafx.com/fxml" fx:controller="app.MainController">
<!--<StackPane fx:id="stackPane" ></StackPane>--> <!-- replace with the following -->
<StackPane fx:id="stackPane" AnchorPane.topAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" ></StackPane>
</AnchorPane>
結果は次のとおりです。
APIドキュメントの場合: http://docs.Oracle.com/javafx/2/api/javafx/scene/layout/AnchorPane.html
私は、SceneBuilderでGUIを設計し、メインコンテナーをウィンドウサイズに合わせて調整しようとしました。幅は常に100%にする必要があります。
ここで、SceneBuilderでこれらの値を設定できます。
点線/赤線を切り替えると、実際にはコルキがソリューションに投稿した属性(AnchorPane.topAnchorなど)を追加/削除するだけです。
here も参照してください
@FXML
private void mnuUserLevel_onClick(ActionEvent event) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("DBedit.fxml"));
loader.setController(new DBeditEntityUserlevel());
try {
Node n = (Node)loader.load();
AnchorPane.setTopAnchor(n, 0.0);
AnchorPane.setRightAnchor(n, 0.0);
AnchorPane.setLeftAnchor(n, 0.0);
AnchorPane.setBottomAnchor(n, 0.0);
mainContent.getChildren().setAll(n);
} catch (IOException e){
System.out.println(e.getMessage());
}
}
シナリオは、子fxmlを親AnchorPaneにロードすることです。子を親に合わせて伸縮させるには、AnChorPane.setxxxAnchorコマンドを使用します。
譲る必要はありません。
ちょうどペインを選択、右クリックそして親に合わせるを選択.
アンカーペインのサイズに合わせてペインのサイズが自動的に変更されます。
Scene Builderを使用している場合は、右側に通常3つのオプション(「プロパティ」、「レイアウト」および「コード」)があるアコーディオンパネルが表示されます。 2番目(「レイアウト」)には、「[親レイアウト]制約」というオプションが表示されます(この場合は「AnchorPane Constrainsts」)。
親レイアウトを表す要素の4つの側面に「0」を配置する必要があります。
FXMLBuilderを使用しているため、非常に簡単です。
次の簡単な手順に従ってください。