繁体   English   中英

将FXML加载到AnchorPane中时如何自动调整大小?

[英]How to resize automatically when loading an FXML into an AnchorPane?

我在加载到AnchorPane中的FXML的布局时遇到麻烦。

我有一个带有AnchorPane的Scene.fxml和一个按钮。 按下按钮会将Internal.fxml加载到AnchorPane中。 Internal.fxml的TextField的AnchorPane约束设置为左右。 就是这样

尽管现在调整窗口大小时,TextField不会调整大小。

为什么TextField不调整自身大小? 以下代码中的错误在哪里?

Main.java:

@Override
public final void start(final Stage firstStage) throws Exception {
    Parent mask = FXMLLoader.load(getClass()
                            .getResource("/fxml/Scene.fxml"));

    Scene scene = new Scene(mask);
    scene.getStylesheets().add("/styles/Styles.css");

    firstStage.setTitle("MyProgram");
    firstStage.setScene(scene);
    firstStage.show();

    Main.stage = firstStage;
}

Scene.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" fx:id="content" prefHeight="600.0" prefWidth="800.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="com.treasury.myprogram.controller.SceneController">
  <children>
    <Button layoutX="257.0" layoutY="227.0" mnemonicParsing="false" onAction="#loadInternal" text="Button" />
  </children>
</AnchorPane>

Internal.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<AnchorPane id="AnchorPane" maxHeight="-1.0" maxWidth="-1.0" minHeight="400.0" minWidth="600.0" prefHeight="-1.0" prefWidth="-1.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="com.treasury.myprogram.controller.InternalController">
  <children>
    <TextField layoutY="14.0" prefWidth="-1.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" />
  </children>
</AnchorPane>

SceneController.java:

package com.treasury.myprogram.controller;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.layout.AnchorPane;

public class SceneController implements Initializable {
    @FXML
    private AnchorPane content;


    @FXML
    private void loadInternal() {
        try {
            AnchorPane internalPane = FXMLLoader.load(getClass().getResource("/fxml/Internal.fxml"));

            this.content.getChildren().setAll(internalPane);

        } catch (IOException ex) {
            System.out.println("Internal error: " + ex.getMessage());
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }
}

编辑:

好的,首先,非常感谢,现在代码可以正常工作了。 好吧,它确实做到了一半,但至少第一个问题不见了。 我现在有一个只能工作一半的FXML。 它有一个GridPane,下面有几个条目和一个TextField。 他们两个都直接在AnchorPane上。 现在,当我处于JavaFX Scene Builder 1.1的构造模式中时,一切看起来都很好,但是当我将此Internal.fxml加载到Scene.fxml中时,只有TextField适应了Parent的大小,而GridPane却没有。 我很难找出原因。 有什么问题? 错配置在哪里?

Internal.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<AnchorPane id="AnchorPane" maxHeight="-1.0" maxWidth="-1.0" minHeight="400.0" minWidth="600.0" prefHeight="-1.0" prefWidth="-1.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="com.treasury.myprogram.controller.InternalController">
  <children>
    <GridPane gridLinesVisible="true" prefHeight="-1.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0">
      <children>
        <Label text="Program name:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
        <Label text="Version:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
        <Label text="Release date:" GridPane.columnIndex="0" GridPane.rowIndex="2" />
        <Label text="myprogram" GridPane.columnIndex="1" GridPane.rowIndex="0" />
        <Label text="1.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
        <Label text="28.02.2014" GridPane.columnIndex="1" GridPane.rowIndex="2" />
        <TextField prefWidth="200.0" GridPane.columnIndex="0" GridPane.rowIndex="3" />
        <TextField prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
      </children>
      <columnConstraints>
        <ColumnConstraints hgrow="SOMETIMES" maxWidth="294.0" minWidth="10.0" prefWidth="112.0" />
        <ColumnConstraints hgrow="SOMETIMES" maxWidth="502.0" minWidth="10.0" prefWidth="478.0" />
      </columnConstraints>
      <rowConstraints>
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
      </rowConstraints>
    </GridPane>
    <TextField layoutY="125.0" prefWidth="590.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" />
  </children>
</AnchorPane>

尝试使用BorderPane而不是锚定窗格,并将子fxml的对象设置为居中。 还要检查场景构建器中的父fxml是否为atuo resizabel。

@FXML private BorderPane bPaneHomeChild;
FXMLLoader loader = new FXMLLoader(getClass.getResource("/fxml/Internal.fxml"));
Pane cmdPane = (Pane) loader.load();
bPaneHomeChild.setCenter(cmdPane);

尝试这样:

AnchorPane.setTopAnchor(<child node>,0.0);
AnchorPane.setBottomAnchor(<child node>,0.0);
AnchorPane.setLeftAnchor(<child node>,0.0);
AnchorPane.setRightAnchor(<child node>,0.0);

选择GridPane左侧,然后单击其周围的阴影区域。 然后在“布局”面板的右侧选择“垂直”和“垂直”到“始终”。 像这样: 在此处输入图片说明

确实有充分的理由不使用任何这些。 JavaFX和JavaFXML是对他人(即Microsoft)的工作的不好的兑现。 Oracle提供的工具看起来好像是1975年就问世的。您正在为该产品和框架而苦苦挣扎,因为考虑不周,甚至执行起来也很差。 发挥自己的潜能,加入网络革命,Angular,REACT,MVC等。 只是不要让别人沉迷于惩罚他的程序员。 Java发生在2000年到2005年之间。那段时间过去了,其余的都还在继续。 不要挂断电话,自己升级。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM