在我的JavaFX应用程序中,某些节点显示在预览中但不可选择且不显示在层次结构中。 SceneBuilder无法定位的例子:
在这个例子中,"名字"列不可定位,并且不会显示在层次结构中,即使它具有与"姓氏"相同的代码。柱。 同样的事情"新..."和"编辑..."按钮。
我的SceneBuilder版本是8.3.0。 我正在使用eclipse,如果必须手动操作,我可以通过FXGraph编辑fxml。
FXML:
<AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="de.is2.address.view.PersonOverviewController" prefHeight="300.0" prefWidth="600.0">
<children>
<SplitPane dividerPositions="0.29797979797979796" layoutX="130.0" layoutY="70.0" prefHeight="300.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children>
<TableView fx:id="personTable" layoutX="-25.0" layoutY="-21.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn fx:id="firstNameColumn" prefWidth="75.0" text="First Name"/>
</columns>
<columns>
<TableColumn fx:id="lastNameColumn" prefWidth="75.0" text="Last Name"/>
</columns>
<columnResizePolicy><TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /></columnResizePolicy>
</TableView>
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children>
<Label layoutX="54.0" layoutY="37.0" text="Person Details" AnchorPane.leftAnchor="5.0" AnchorPane.topAnchor="5.0"/>
<GridPane layoutX="67.0" layoutY="78.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="30.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
</columnConstraints>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<children>
<Label text="First Name"/>
<Label text="Last Name" GridPane.rowIndex="1"/>
<Label text="Street" GridPane.rowIndex="2"/>
<Label text="City" GridPane.rowIndex="3"/>
<Label text="Postal Code" GridPane.rowIndex="4"/>
<Label text="Birthday" GridPane.rowIndex="5"/>
<Label fx:id="firstNameLabel" text="Label" GridPane.columnIndex="1"/>
<Label fx:id="lastNameLabel" text="Label" GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<Label fx:id="streetLabel" text="Label" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<Label fx:id="cityLabel" text="Label" GridPane.columnIndex="1" GridPane.rowIndex="3"/>
<Label fx:id="postalCodeLabel" text="Label" GridPane.columnIndex="1" GridPane.rowIndex="4"/>
<Label fx:id="birthdayLabel" text="Label" GridPane.columnIndex="1" GridPane.rowIndex="5"/>
</children>
</GridPane>
<ButtonBar layoutX="203.0" layoutY="244.0" prefHeight="39.0" prefWidth="265.0" AnchorPane.bottomAnchor="5.0" AnchorPane.rightAnchor="10.0">
<buttons>
<Button mnemonicParsing="false" text="New..."/>
</buttons>
<buttons>
<Button mnemonicParsing="false" text="Edit..."/>
</buttons>
<buttons>
<Button mnemonicParsing="false" onAction="#handleDeletePerson" text="Delete"/>
</buttons>
</ButtonBar>
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
答案 0 :(得分:1)
在FXML的几个地方,您反复定义相同标签的内容,如此(片段):
<columns>
<TableColumn fx:id="firstNameColumn" prefWidth="75.0" text="First Name"/>
</columns>
<columns> <!-- repetition!! -->
<TableColumn fx:id="lastNameColumn" prefWidth="75.0" text="Last Name"/>
</columns>
这是不正确的 - 你应该打开标签一次,然后指定所有的孩子,然后关闭它一次。您正在为GridPane的子项正确执行此操作,例如:
<GridPane layoutX="67.0" layoutY="78.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="30.0">
<children>
<Label text="First Name"/>
<Label text="Last Name" GridPane.rowIndex="1"/>
<Label text="Street" GridPane.rowIndex="2"/>
...
</children>
</GridPane>
根据我的经验,JavaFx本身接受(如在预期中一样显示)一些非常有趣的FXML结构,但是SceneBuilder往往更保守,只接受典型的结构。这可能是预览看起来很好的原因,但层次结构不完整。如果您手动编辑FXML,请先看一下SceneBuilder创建相同结构的方式 - 就像它期望的那样。
如果您在任何地方更正了嵌套,则生成的FXML为:
<AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="de.is2.address.view.PersonOverviewController"
prefHeight="300.0" prefWidth="600.0">
<children>
<SplitPane dividerPositions="0.29797979797979796" layoutX="130.0" layoutY="70.0" prefHeight="300.0"
prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children>
<TableView fx:id="personTable" layoutX="-25.0" layoutY="-21.0" prefHeight="200.0"
prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn fx:id="firstNameColumn" prefWidth="75.0" text="First Name" />
<TableColumn fx:id="lastNameColumn" prefWidth="75.0" text="Last Name" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children>
<Label layoutX="54.0" layoutY="37.0" text="Person Details" AnchorPane.leftAnchor="5.0"
AnchorPane.topAnchor="5.0" />
<GridPane layoutX="67.0" layoutY="78.0" AnchorPane.leftAnchor="5.0"
AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="30.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="First Name" />
<Label text="Last Name" GridPane.rowIndex="1" />
<Label text="Street" GridPane.rowIndex="2" />
<Label text="City" GridPane.rowIndex="3" />
<Label text="Postal Code" GridPane.rowIndex="4" />
<Label text="Birthday" GridPane.rowIndex="5" />
<Label fx:id="firstNameLabel" text="Label" GridPane.columnIndex="1" />
<Label fx:id="lastNameLabel" text="Label" GridPane.columnIndex="1"
GridPane.rowIndex="1" />
<Label fx:id="streetLabel" text="Label" GridPane.columnIndex="1"
GridPane.rowIndex="2" />
<Label fx:id="cityLabel" text="Label" GridPane.columnIndex="1" GridPane.rowIndex="3" />
<Label fx:id="postalCodeLabel" text="Label" GridPane.columnIndex="1"
GridPane.rowIndex="4" />
<Label fx:id="birthdayLabel" text="Label" GridPane.columnIndex="1"
GridPane.rowIndex="5" />
</children>
</GridPane>
<ButtonBar layoutX="203.0" layoutY="244.0" prefHeight="39.0" prefWidth="265.0"
AnchorPane.bottomAnchor="5.0" AnchorPane.rightAnchor="10.0">
<buttons>
<Button mnemonicParsing="false" text="New..." />
<Button mnemonicParsing="false" text="Edit..." />
<Button mnemonicParsing="false" onAction="#handleDeletePerson" text="Delete" />
</buttons>
</ButtonBar>
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</AnchorPane>
这为我在SceneBuilder 8.4.1中提供了所需的结果:ButtonBar中的所有表格列和所有按钮都在层次结构中显示和选择。