JavaFX:在 window(阶段)上移动元素调整大小

JavaFX: move element on window (stage) resize

我在 JavaFX 上有一个简单的应用程序,它实际上由几个窗格和按钮组成。我不知道如何在舞台调整大小时移动按钮。所以,我希望即使在调整 window 大小时,左下角的按钮也始终可见。

这里是节点概览:

这里是 fxml:

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

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.geometry.Point3D?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="750.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/9.0.4" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <BorderPane layoutX="89.0" layoutY="64.0" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <left>
            <AnchorPane prefHeight="150.0" prefWidth="150.0" style="-fx-background-color: #4059a9 #4059a9;" BorderPane.alignment="CENTER">
               <children>
                  <AnchorPane prefHeight="750.0" prefWidth="75.0" style="-fx-background-color: #2b4496 #2b4496;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="75.0" AnchorPane.topAnchor="0.0">
                     <children>
                        <VBox alignment="CENTER" prefHeight="750.0" prefWidth="75.0" spacing="35.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                           <children>
                              <JFXButton contentDisplay="GRAPHIC_ONLY" prefWidth="82.0" VBox.vgrow="ALWAYS">
                                 <graphic>
                                    <FontAwesomeIconView fill="WHITE" glyphName="HOME" size="2em" />
                                 </graphic>
                                 <VBox.margin>
                                    <Insets top="25.0" />
                                 </VBox.margin>
                              </JFXButton>
                              <JFXButton contentDisplay="GRAPHIC_ONLY" prefWidth="75.0">
                                 <VBox.margin>
                                    <Insets bottom="10.0" top="600.0" />
                                 </VBox.margin>
                                 <graphic>
                                    <FontAwesomeIconView fill="WHITE" glyphName="SIGN_OUT" size="2em" />
                                 </graphic>
                                 <opaqueInsets>
                                    <Insets />
                                 </opaqueInsets>
                              </JFXButton>
                           </children>
                        </VBox>
                     </children>
                     <rotationAxis>
                        <Point3D />
                     </rotationAxis>
                  </AnchorPane>
               </children>
            </AnchorPane>
         </left>
      </BorderPane>
   </children>
</AnchorPane>

您的问题是您在 Buttons 上设置的页边距。按照这个布局。我使用 HBox 作为根节点。

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

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>


<HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <VBox alignment="CENTER" prefWidth="75.0" style="-fx-background-color: #2b4496 #2b4496;">
         <children>
            <JFXButton contentDisplay="GRAPHIC_ONLY" prefWidth="82.0" VBox.vgrow="ALWAYS">
               <graphic>
                  <FontAwesomeIconView fill="WHITE" glyphName="HOME" size="2em" />
               </graphic>
               <VBox.margin>
                  <Insets top="25.0" />
               </VBox.margin>
            </JFXButton>
            <Button maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" opacity="0.0" VBox.vgrow="ALWAYS" />
            <JFXButton contentDisplay="GRAPHIC_ONLY" prefWidth="75.0">
               <VBox.margin>
                  <Insets bottom="25.0" />
               </VBox.margin>
               <graphic>
                  <FontAwesomeIconView fill="WHITE" glyphName="SIGN_OUT" size="2em" />
               </graphic>
               <opaqueInsets>
                  <Insets />
               </opaqueInsets>
            </JFXButton>
         </children>
      </VBox>
      <VBox prefHeight="200.0" prefWidth="75.0" style="-fx-background-color: #4059a9 #4059a9;" />
      <AnchorPane prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS" />
   </children>
</HBox>

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
   <left>
      <VBox BorderPane.alignment="CENTER">
         <children>
            <Button mnemonicParsing="false" text="Button" />
            <AnchorPane VBox.vgrow="ALWAYS" />
            <Button mnemonicParsing="false" text="Button" />
         </children>
      </VBox>
   </left>
</BorderPane>

在中间添加一个空窗格,并将 VGROW 设置为 ALWAYS。

看起来您可以通过使用带有叠加背景填充的 BorderPaneVBox 以及始终在您的按钮之间插入的 Region 来实现相同的效果:

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

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.Region?>

<BorderPane prefHeight="750.0" prefWidth="1000.0"
    xmlns="http://javafx.com/javafx/9.0.4"
    xmlns:fx="http://javafx.com/fxml/1">
    <left>
        <VBox alignment="TOP_LEFT"
            spacing="35.0"
            style="-fx-background-color: #2b4496, #4059a9; -fx-background-insets: 0, 0 0 0 75;"> <!-- overlay 2 backgrounds produce rectangles -->
            <padding>
                <Insets right="75.0" />
            </padding>
            <children>
                <JFXButton contentDisplay="GRAPHIC_ONLY" prefWidth="82.0"  VBox.vgrow="NEVER">
                    <graphic>
                        <FontAwesomeIconView fill="WHITE" glyphName="HOME" size="2em" />
                     </graphic>
                     <VBox.margin>
                        <Insets top="25.0" />
                     </VBox.margin>
                  </JFXButton>
                  <Region VBox.vgrow="ALWAYS" /> <!-- filler -->
                  <JFXButton contentDisplay="GRAPHIC_ONLY" prefWidth="75.0" VBox.vgrow="NEVER">
                     <VBox.margin>
                        <Insets bottom="10.0" />
                     </VBox.margin>
                     <graphic>
                        <FontAwesomeIconView fill="WHITE" glyphName="SIGN_OUT" size="2em" />
                     </graphic>
                 </JFXButton>
            </children>
        </VBox>
    </left>
</BorderPane>