SceneBuilder节点不可选

时间:2017-10-24 12:25:57

标签: java javafx javafx-8 fxml scenebuilder

在我的JavaFX应用程序中,某些节点显示在预览中但不可选择且不显示在层次结构中。 SceneBuilder无法定位的例子:

SceneBuilder untargetable example

在这个例子中,"名字"列不可定位,并且不会显示在层次结构中,即使它具有与"姓氏"相同的代码。柱。 同样的事情"新..."和"编辑..."按钮。

我的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>

1 个答案:

答案 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中的所有表格列和所有按钮都在层次结构中显示和选择。