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

Java FX-FXML:将FXML宽度绑定到不同的FXML宽度

胥智
2023-03-14

我有一个TabPane FXML文件,当你按下一个按钮时,它会添加一个新的选项卡,从另一个FXML文件中获取内容。如何将选项卡的宽度绑定到选项卡窗格的宽度?

@FXML
private void makeNewTab(ActionEvent event) {

    int totalTabs = selectTab.getTabs().size() - 1; // this is the TabPane

    Tab newTab = new Tab();
    newTab.setText("New tab" + totalTabs);
    newTab.setClosable(false);

    try{
    newTab.setContent(FXMLLoader.load(getClass().getResource("CoreScenes/NewTabSceneFXML.fxml")));
    }
    catch(IOException e){
    System.out.println("Failed to Load 'NewTabSceneFXML.fxml'. Unknown Error.");
    }


    selectTab.getTabs().add(newTab);
}

这是因为它增加了标签罚款,但它不适合它的宽度,这是我所需要的。

编辑1:

这是一个从头开始的例子,可能是因为我正在使用场景构建,但我不知道。将所有内容的大小设置为计算大小不是我需要的。我需要的是找出如何将子 fxml 文件的节点绑定到其父 fxml 文件的节点。因此,当我调整屏幕大小时,所有内容都会调整大小,但在场景生成器中似乎是不可能的。

不绑定,舞台太小

当我展开屏幕时,更多的子选项卡显示出来。

主要FXML:

<TabPane fx:id="mainTab" prefHeight="453.0" prefWidth="499.0" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1"  fx:controller="testtabs.FXMLDocumentController">
   <tabs>
      <Tab fx:id="ranTab" text="Untitled Tab 1">
         <content>
            <Button fx:id="button" mnemonicParsing="false" onAction="#handleButtonAction" prefHeight="100.0" prefWidth="115.0" text="Button" />
         </content>
      </Tab>
   </tabs>
</TabPane>

二级FXML:

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testtabs.FXMLTab2Controller">
   <children>
      <TabPane prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE">
        <tabs>
          <Tab text="Untitled Tab 1">
               <content>
                  <HBox prefHeight="100.0" prefWidth="200.0">
                     <children>
                        <SplitPane prefHeight="200.0" prefWidth="200.0" />
                        <ScrollPane prefHeight="200.0" prefWidth="200.0">
                          <content>
                            <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="200.0" />
                          </content>
                        </ScrollPane>
                        <ScrollPane prefHeight="200.0" prefWidth="200.0" />
                     </children>
                  </HBox>
               </content></Tab>
          <Tab text="Untitled Tab 2" />
        </tabs>
      </TabPane>
   </children>
</AnchorPane>

共有1个答案

宋瀚海
2023-03-14

问题是二级fxml:

在没有为子级指定锚点的情况下,AnchorPane 的行为就像一个窗格,即子级的大小被调整为他们的首选大小,并且无论锚窗格的大小如何,都保留此大小。

若要更改此行为,请在辅助fxml中的< code>TabPane上指定这些约束:

<TabPane prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.topAnchor="0" AnchorPane.bottomAnchor="0">
    ...
</TabPane>

或更简单的使用

<TabPane prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testtabs.FXMLTab2Controller">
    ...
</TabPane>

注: 用作此 TabPane 内容的 HBox 不会将子项的大小调整为大于首选宽度的宽度,因为您没有使用默认值 (NEVER) 以外的 hgrow 属性。您也可以解决此问题,例如,始终像这样扩展 ScrollPane

<HBox prefHeight="100.0" prefWidth="200.0">
   <children>
      <SplitPane prefHeight="200.0" prefWidth="200.0" />
      <ScrollPane prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS">
        <content>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="200.0" />
        </content>
      </ScrollPane>
      <ScrollPane prefHeight="200.0" prefWidth="200.0" />
   </children>
</HBox>

 类似资料:
  • 我在相应的控制器中有一个用FXML创建的窗口,我有一个按钮,当单击特定的按钮时,它会加载一个小框。这个盒子也是使用FXML设计的。 当我加载盒子并想把它添加到窗口中时,我得到这个错误: 这是我的代码: 主窗口FXML: 我要动态创建的框的FXML:

  • 我的应用程序有选项卡式窗格,所以为了保持fxml文件的可管理性,我有一个包含选项卡的主fxml文件,并为每个其他选项卡单独设置一个fxml。这很好,但出于某种原因,应用程序已经停止加载第二个标签。我试着在主应用程序中单独加载它,效果很好。我尝试创建一个新的fxml文件作为测试,并加载它,这也是有效的。但是,它不会将其加载到第二个选项卡中。此外,控制台没有输出。 第二个: 很抱歉代码太长,并提前感谢

  • 我需要创建许多不同的FXML文件,每个文件都有一个一致的布局。每一个都有一个锚烷,可以容纳不同的内容物。 有没有办法加载一个“基本”FXML文件,然后加载第二个FXML文件,并将数据路由到第一个FXML文件? 例如,FXML#1有一个边框。FXML#2有一个按钮,文本字段,标签等。如何加载#1,然后加载#2作为#1的孩子?

  • 我正在尝试创建一个用于多屏幕分辨率(也是高分辨率)的JavaFX应用程序。 我正在使用以下代码段。 main.fxml Scaling.java

  • multilanguageSupport.java LanguageIfxml.fxml LanguageIfXMLController.java 错误消息: .属性文件在包TextData中定义

  • 我是JavaFX新手,在做我的项目时,我尝试切换屏幕。我正在考虑相应的AnchorPane可见性设置为真或假,当从另一个控制器访问AnchorPane时,我遇到了问题。我试图使AnchorPane成为静态的,但它给出了NullPointerException。 这是我的密码。 控制器类 SignUpController类 我试图像这样解决问题,但它关闭了窗口并打开了一个新窗口。