【问题标题】:JavaFX isn't repositioning (on-resize) properlyJavaFX 没有正确重新定位(调整大小)
【发布时间】:2021-05-01 10:40:18
【问题描述】:

我对 JavaFX 很陌生。我尝试制作一个简单的 GUI,但结果并不正确。

它在 SceneBuilder 中的外观如下: https://imgur.com/a/3aJefh4
在实际的应用程序中: https://imgur.com/a/JpszR9m

如果我把它缩小,按钮就会消失。如果我把它调整大,那就没问题了。
对不起,如果我解释得不好......


Main.java

package sample;

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 {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


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

Controller.java

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Controller {
    @FXML private Button logoutButton;
    @FXML private AnchorPane scene;
    Stage stage;

    public void logout() {
        stage = (Stage) scene.getScene().getWindow();
        stage.close();
    }
}

sample.fxml

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>

<GridPane alignment="center" hgap="10" maxHeight="-Infinity" maxWidth="-Infinity" vgap="10" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <columnConstraints>
      <ColumnConstraints />
      <ColumnConstraints />
   </columnConstraints>
   <rowConstraints>
      <RowConstraints />
      <RowConstraints />
   </rowConstraints>
   <children>
      <AnchorPane fx:id="scene" prefHeight="300.0" prefWidth="500.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
         <children>
            <Button fx:id="logoutButton" layoutX="224.0" layoutY="138.0" mnemonicParsing="false" onAction="#logout" text="Logout" />
         </children>
      </AnchorPane>
   </children>
</GridPane>

【问题讨论】:

  • 顺便说一句:当布局不符合您的预期时,不要硬编码尺寸 - 这里可能的罪魁祸首是场景/舞台的尺寸与硬编码的尺寸冲突fxml
  • 您应该删除 AnchorPane 并使用将节点保持在中心的容器(当您将对齐设置为中心时)而不是硬编码大小值,如果您要调整很多这样的大小作为VBoxHBoxBorderPane给你一些例子
  • 你基本上需要学习如何使用Parent节点。在这种情况下,您唯一应该拥有的是 StackPane 作为根节点,Button 作为其子节点。从这里开始 -> docs.oracle.com/javafx/2/layout/jfxpub-layout.htm
  • 您预计会发生什么?您正在为按钮指定一个固定位置 (layoutX="224.0" layoutY="138.0")。很明显,调整窗口大小时它不会重新定位。

标签: java user-interface javafx


【解决方案1】:

总结许多 cmets 提到的内容,请注意在左下方的 SceneBuilder 图像中您有一个 GridPane,并且在该 GridPane(在其中一个单元格中)中放置了一个 AnchorPane。我假设您的按钮位于 AnchorPane 上。

AnchorPanes 遵循为其子项(按钮)分配精确像素坐标的规则,因此,如果该像素不在视野范围内,(窗格太小)按钮将不可见。这不是你想要的。为了解决这个问题,应该使用一个新容器(正如评论者所建议的那样)。

我建议您删除您的 GridPane(因此所有内容),而是将一个 BorderPane 拖放到您的 GridPane 所在的位置。您会注意到 BorderPane 有一个中心区域(以及顶部、左侧、底部和右侧区域)

将您的按钮放在这个中心区域,然后再次尝试运行。当 BorderPane 调整大小时,按钮应移动以适应相同的相对位置。

【讨论】:

  • 它可以工作,但我不能把它放在中间......或者我想要的任何地方......
  • 好的,在BorderPane的中心,你拖放一个VBox怎么样。单击 VBox 并转到布局选项卡,应该有一个设置为“继承”的“HGrow”字段。将其更改为“始终”。接下来,在 VBox 中放置一个“区域”,转到该区域的布局选项卡,并将其“VGrow”属性也更改为“始终”。现在,将您的按钮放到 VBox 中。最后,右键单击该区域,然后按“复制”。这应该使您的按钮始终位于中心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多