web-dev-qa-db-ja.com

パネル内のJavaFXパネルの自動サイズ変更

FXMLファイルが1つしかないJavaFXアプリケーションがあります。このファイルには、内部にStackPaneがあるAnchorPaneが1つあります。スクリーンショットは次のとおりです。

my panel inside panel application

このアプリケーションを起動するときに、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%;
}
44
Korki Korkig

数時間の検索とテストの後、質問を投稿した直後にようやく入手できました!

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>

結果は次のとおりです。

enter image description here

APIドキュメントの場合: http://docs.Oracle.com/javafx/2/api/javafx/scene/layout/AnchorPane.html

74
Korki Korkig

私は、SceneBuilderでGUIを設計し、メインコンテナーをウィンドウサイズに合わせて調整しようとしました。幅は常に100%にする必要があります。

ここで、SceneBuilderでこれらの値を設定できます。

AnchorPane Constraints in SceneBuilder

点線/赤線を切り替えると、実際にはコルキがソリューションに投稿した属性(AnchorPane.topAnchorなど)を追加/削除するだけです。

14
Ginchen

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コマンドを使用します。

9
Dean Chiu

譲る必要はありません。

ちょうどペインを選択右クリックそして親に合わせるを選択.

アンカーペインのサイズに合わせてペインのサイズが自動的に変更されます。

1
Paragfalle

Scene Builderを使用している場合は、右側に通常3つのオプション(「プロパティ」、「レイアウト」および「コード」)があるアコーディオンパネルが表示されます。 2番目(「レイアウト」)には、「[親レイアウト]制約」というオプションが表示されます(この場合は「AnchorPane Constrainsts」)。

親レイアウトを表す要素の4つの側面に「0」を配置する必要があります。

0
Fran Pastor

FXMLBuilderを使用しているため、非常に簡単です。

次の簡単な手順に従ってください。

  1. FXMLファイルをFXMLBuilderに開きます。
  2. スタックペインを選択します。
  3. [レイアウト]タブ[FXMLBuilderの左側のタブ]を開きます。
  4. TOP、LEFT、RIGHT、BOTTOMなど、ステージのサイズ変更中にペインサイズを計算するためのサイド値を設定します。
0
Sandeep Kumar