当前位置: 首页 > 知识库问答 >
问题:

Javafx组件应该始终位于AnchorPane的中心

顾泰平
2023-03-14

我希望我的Javafx组件,如标签、单独包装在vbox中的文本字段,即使调整了大小,也保持在窗口的中心。请参阅附件中的图片。目前,这些成分包含在锚烷中。下面给出了FXML文件代码。请告诉我怎么做。谢谢

组件位于中间的小尺寸窗口的图像。

全尺寸窗口,但部件位置不变。

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

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

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="650.0" minWidth="850.0" prefHeight="650.0" prefWidth="850.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
  <HBox layoutY="-1.0" minWidth="500.0" prefHeight="653.0" prefWidth="850.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
     <children>
        <MenuBar layoutY="-1.0" minWidth="500.0" prefHeight="30.0" prefWidth="850.0" HBox.hgrow="ALWAYS">
          <menus>
            <Menu mnemonicParsing="false" text="Account">
              <items>
                <MenuItem fx:id="menuItemCreate" mnemonicParsing="false" text="Create" />
                    <MenuItem fx:id="menuItemUpdate" mnemonicParsing="false" text="Update" />
                    <MenuItem fx:id="menuItemDelete" mnemonicParsing="false" text="Delete" />
                    <MenuItem fx:id="menuItemLedger" mnemonicParsing="false" text="Ledger" />
              </items>
            </Menu>
            <Menu mnemonicParsing="false" text="In Stock">
              <items>
                <MenuItem fx:id="menuItemAddItem" mnemonicParsing="false" text="Add items" />
                    <MenuItem fx:id="menuItemInventory" mnemonicParsing="false" text="Inventory" />
              </items>
            </Menu>
            <Menu mnemonicParsing="false" text="Reports">
              <items>
                <MenuItem fx:id="menuItemSalesReport" mnemonicParsing="false" text="Sales report" />
                    <MenuItem fx:id="menuItemProfitReport" mnemonicParsing="false" text="Profit report" />
                    <MenuItem fx:id="menuItemRcvables" mnemonicParsing="false" text="Receivables" />
              </items>
            </Menu>
          </menus>
        </MenuBar>
     </children>
  </HBox>
  <AnchorPane fx:id="anchorPaneUpdate" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false">
     <children>
        <VBox layoutX="300.0" layoutY="150.0" prefHeight="120.0" prefWidth="60.0" spacing="30.0">
           <children>
              <Label alignment="BASELINE_RIGHT" prefWidth="60.0" text="Full Name" BorderPane.alignment="CENTER" VBox.vgrow="NEVER" />
              <Label alignment="BASELINE_RIGHT" layoutX="10.0" layoutY="10.0" prefWidth="60.0" text="Address" VBox.vgrow="NEVER" />
              <Label alignment="BASELINE_RIGHT" layoutX="10.0" layoutY="27.0" prefWidth="60.0" text="CNIC" VBox.vgrow="NEVER" />
              <Label alignment="BASELINE_RIGHT" layoutX="10.0" layoutY="44.0" prefWidth="60.0" text="Mobile #" VBox.vgrow="NEVER" />
           </children>
        </VBox>
        <VBox layoutX="400.0" layoutY="150.0" spacing="20.0">
           <children>
              <TextField layoutX="10.0" layoutY="10.0" promptText="Full name" />
              <TextField promptText="Full name" VBox.vgrow="NEVER" />
              <TextField promptText="Current address" VBox.vgrow="NEVER" />
              <TextField promptText="XXXXX-XXXXXXX-X" VBox.vgrow="NEVER" />
              <TextField promptText="XXXX-XXXXXXX" VBox.vgrow="NEVER" />
              <Button mnemonicParsing="false" prefWidth="70.0" text="Create" />
           </children>
        </VBox>
        <Label layoutX="50.0" layoutY="80.0" text="Update a customer account">
           <font>
              <Font name="Arial Narrow Bold" size="17.0" />
           </font>
        </Label>
     </children></AnchorPane>
  <AnchorPane fx:id="anchorPaneDelete" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false" />
  <AnchorPane fx:id="anchorPaneLedger" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false" />
  <AnchorPane fx:id="anchorPaneAddItem" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false" />
  <AnchorPane fx:id="anchorPaneInventory" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false" />
  <AnchorPane fx:id="anchorPaneSalesReport" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false" />
  <AnchorPane fx:id="anchorPaneProfitReport" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false" />
  <AnchorPane fx:id="anchorPanerRcvable" layoutY="30.0" prefHeight="620.0" prefWidth="850.0" visible="false" />
  <VBox layoutX="300.0" layoutY="230.0" AnchorPane.bottomAnchor="199.0" AnchorPane.leftAnchor="300.0" AnchorPane.rightAnchor="301.0" AnchorPane.topAnchor="200.0">
     <children>
        <StackPane fx:id="pane_main" minHeight="200.0" minWidth="200.0" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS">
           <children>
              <Group>
                 <children>
                    <VBox spacing="10.0">
                       <children>
                          <HBox prefHeight="30.0" prefWidth="330.0" spacing="30.0">
                             <children>
                                <Label alignment="BASELINE_RIGHT" prefWidth="80.0" text="Search Name" />
                                <TextField minWidth="130.0" prefWidth="130.0" promptText="Enter name" />
                             </children>
                          </HBox>
                          <Label alignment="BASELINE_RIGHT" prefWidth="80.0" text="Details:" />
                          <Separator minWidth="165.0" prefHeight="10.0" prefWidth="330.0" />
                          <HBox spacing="30.0">
                             <children>
                                <VBox spacing="30.0">
                                   <children>
                                      <Label alignment="BASELINE_RIGHT" prefWidth="80.0" text="Full Name" VBox.vgrow="NEVER" />
                                      <Label alignment="BASELINE_RIGHT" layoutX="10.0" layoutY="10.0" prefWidth="80.0" text="Address" VBox.vgrow="NEVER" />
                                      <Label alignment="BASELINE_RIGHT" layoutX="10.0" layoutY="10.0" prefWidth="80.0" text="CNIC" VBox.vgrow="NEVER" />
                                      <Label alignment="BASELINE_RIGHT" layoutX="20.0" layoutY="20.0" prefWidth="80.0" text="Mobile #" VBox.vgrow="NEVER" />
                                   </children>
                                </VBox>
                                <VBox layoutX="100.0" spacing="20.0">
                                   <children>
                                      <TextField minWidth="130.0" prefWidth="130.0" promptText="Full name" VBox.vgrow="NEVER" />
                                      <TextField minWidth="130.0" prefWidth="130.0" promptText="Current address" VBox.vgrow="NEVER" />
                                      <TextField minWidth="130.0" prefWidth="130.0" promptText="XXXXX-XXXXXXX-X" VBox.vgrow="NEVER" />
                                      <TextField minWidth="130.0" prefWidth="130.0" promptText="XXXX-XXXXXXX" VBox.vgrow="NEVER" />
                                      <Button minWidth="70.0" mnemonicParsing="false" prefWidth="70.0" text="Create" VBox.vgrow="NEVER" />
                                   </children>
                                </VBox>
                             </children>
                          </HBox>
                          <Label text="Update a customer account" VBox.vgrow="NEVER">
                             <font>
                                <Font name="Arial Narrow Bold" size="17.0" />
                             </font>
                          </Label>
                       </children>
                    </VBox>
                 </children>
              </Group>
           </children>
        </StackPane>
     </children>
  </VBox>
  </children>
  </AnchorPane>

共有2个答案

谯振国
2023-03-14

我很快就把它组合起来了。在你的代码中有许多锚定,中间的形式元素在不同的位置,我认为这使得一切变得更困难。相反,我使用了一个网格窗格:

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

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

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <MenuBar>
            <menus>
                <Menu text="Account">
                    <items>
                        <MenuItem fx:id="menuItemCreate" text="Create" />
                        <MenuItem fx:id="menuItemUpdate" text="Update" />
                        <MenuItem fx:id="menuItemDelete" text="Delete" />
                        <MenuItem fx:id="menuItemLedger" text="Ledger" />
                    </items>
                </Menu>
                <Menu text="In Stock">
                    <items>
                        <MenuItem fx:id="menuItemAddItem" text="Add items" />
                        <MenuItem fx:id="menuItemInventory" text="Inventory" />
                    </items>
                </Menu>
                <Menu text="Reports">
                    <items>
                        <MenuItem fx:id="menuItemSalesReport" text="Sales report" />
                        <MenuItem fx:id="menuItemProfitReport" text="Profit report" />
                        <MenuItem fx:id="menuItemRcvables" text="Receivables" />
                    </items>
                </Menu>
            </menus>
        </MenuBar>
        <BorderPane VBox.vgrow="ALWAYS">
            <top>
                <Label text="Create a new customer account" BorderPane.alignment="CENTER">
                    <font>
                        <Font name="Arial Narrow Bold" size="17.0" />
                    </font>
                    <BorderPane.margin>
                        <Insets />
                    </BorderPane.margin>
                </Label>
            </top>
            <center>
                <GridPane alignment="TOP_CENTER" hgap="10.0" vgap="5.0">
                    <columnConstraints>
                        <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" percentWidth="0.0" />
                        <ColumnConstraints hgrow="SOMETIMES" percentWidth="0.0" />
                    </columnConstraints>
                    <rowConstraints>
                        <RowConstraints />
                        <RowConstraints />
                        <RowConstraints />
                        <RowConstraints />
                    </rowConstraints>
                    <children>
                        <Label text="Label">
                            <GridPane.margin>
                                <Insets />
                            </GridPane.margin>
                        </Label>
                        <Label text="Label" GridPane.rowIndex="1" />
                        <Label text="Label" GridPane.rowIndex="2" />
                        <Label text="Label" GridPane.rowIndex="3" />
                        <TextField GridPane.columnIndex="1" />
                        <TextField GridPane.columnIndex="1" GridPane.rowIndex="1" />
                        <TextField GridPane.columnIndex="1" GridPane.rowIndex="2" />
                        <TextField GridPane.columnIndex="1" GridPane.rowIndex="3" />
                    </children>
                    <BorderPane.margin>
                        <Insets top="15.0" />
                    </BorderPane.margin>
                </GridPane>
            </center>
            <VBox.margin>
                <Insets top="15.0" />
            </VBox.margin>
        </BorderPane>
    </children>
</VBox>

如果您希望它与顶部和/或底部重新大小,您可以调整边距。

注意:正如我在代码中看到的,有很多不可见的对象。我不知道他们是故意在那里还是只是死代码。在我的例子中,我只创建了可见的东西。

戚飞雨
2023-03-14

你应该把所有你喜欢的东西放在一个组的中间。然后将您的组放入StackPane中。这样,您的组始终保持在StackPane的中心。根据需要定义StackPane的大小,或者将其绑定到AnchorPane父节点,如示例所示:

在fxml中应该是这样的:

    <AnchorPane>
       <children>
          <StackPane AnchorPane.bottomAnchor="0.0" AnchorPane.left...>
             <children>
                <Group StackPane.alignment="CENTER">
                   <children>
                      ...       
                    </children>
                 </Group>
              </children>
            </StackPane>
          </children>
     </AnchorPane>

那应该能解决你的问题。

 类似资料:
  • 我的应用程序的主要GUI由一个JDesktopPane组成,它位于框架内容窗格的中心,使用BorderLayout。我希望在屏幕的右上角放置一个组件,它仍然允许用户将空间中的JinternalFrame拖动到该组件的左下角。 将构件设置为BorderLayout的北部或东部似乎会填充整个空间。我想BorderLayout可能不是我想要实现的最好的布局管理器?对更好的方法有什么建议吗?

  • 本文向大家介绍javafx AnchorPane,包括了javafx AnchorPane的使用技巧和注意事项,需要的朋友参考一下 示例 AnchorPane 是一种布局,允许将内容放置在距离其侧面特定距离的位置。 有4种设置方法和4种获取距离的方法AnchorPane。这些方法的第一个参数是child Node。设置器的第二个参数是Double要使用的值。该值可以null指示给定边没有约束。 s

  • 问题内容: 我的应用程序的主要GUI由JDesktopPane组成,该JDesktopPane在框架的内容窗格的CENTER处使用BorderLayout。我希望在屏幕的右上方放置一个组件,该组件仍允许用户将JInternalFrames拖动到该组件的左侧和底部。 将组件设置为BorderLayout的NORTH或EAST似乎会填满整个空间。我以为BorderLayout可能不是我要完成的最佳布局

  • 问题内容: 在编写自己的类时,是否总是有必要重写? 如果我不这样做,它将自动检查所有字段是否相同?还是只是检查两个变量是否指向同一个对象? 问题答案: 如果正在编写将要以某种方式比较其对象的类,则应重写和方法。 不提供显式方法将导致从超类继承该方法的行为,并且在超类为类的情况下,它将成为Java API规范中针对该类设定的行为。 提供方法的一般约定可以在该类的文档中找到,特别是and 方法的文档。

  • 问题内容: 导入总是放在文件的顶部,紧随任何模块注释和文档字符串之后,以及模块全局变量和常量之前。 但是,如果我要导入的类/方法/函数仅在极少数情况下使用,那么确定在需要时进行导入肯定会更有效吗? 这不是吗? 比这更有效? 问题答案: 模块导入非常快,但不是即时的。这意味着: 将导入放在模块顶部很好,因为这是微不足道的成本,只需要支付一次即可。 将导入放在函数中将导致对该函数的调用花费更长时间。

  • 问题内容: SQLVIEW是一个全局逻辑表,该表可能会持久化也可能不会持久化。但这仍然是一张桌子。因此,VIEW是否应始终遵循第一范式(1NF)?也就是说,没有重复的行,仅是标量类型,没有从上到下或从左到右的顺序,等等。较高的范式怎么办? 对我来说,我的应用程序“使用”存储的proc的结果,我的VIEWs被SQL查询“使用”,并且这两种用法是互斥的(即,我不使用SQL查询存储的proc的结果集,而