代码之家  ›  专栏  ›  技术社区  ›  Tymur Berezhnoi

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

  •  1
  • Tymur Berezhnoi  · 技术社区  · 5 年前

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

    以下是节点概述:

    enter image description here

    以下是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>
    3 回复  |  直到 5 年前
        1
  •  3
  •   fabian    5 年前

    BorderPane VBox 使用叠加的背景填充和 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>
    
        2
  •  3
  •   SedJ601    5 年前

    你的问题是你设定的利润率 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>
    

    enter image description here

    enter image description here

        3
  •  3
  •   Andy Nugent    5 年前
    <?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设置为“始终”。

    enter image description here enter image description here