AnchorPane元素忽略鼠标单击

时间:2018-11-20 11:26:10

标签: java javafx fxml

我初始化了一些元素而不是我的锚定窗格:

AnchorPane root = new AnchorPane(listLoader.load(), textareaLoader.load(), fieldLoader.load(), menuLoader.load(), buttonLoader.load());

但是当我尝试单击MenuBar或List View时,它不起作用。例如,在这种情况下,我可以单击按钮(也许),因为它是我在AnchorPane构造函数中初始化的最后一个元素。我无法使用BorderPane或任何其他布局,因此需要使用此配置查找解决方案。 这些是我的fxml文件:

list.fxml

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mailbox.ListController">
<children>
    <AnchorPane> 
        <children>
            <ListView fx:id="listView" layoutX="1.0" layoutY="31.0" prefHeight="371.0" prefWidth="239.0" />
        </children>
    </AnchorPane> 
</children>

menuBar.fxml

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="mailbox.MenuBarController">
<children>
    <AnchorPane> 
        <children>
            <MenuBar fx:id="menuBar" layoutX="0.0" layoutY="0.0">
                <menus>
                    <Menu text="File">
                        <items>
                            <MenuItem onAction="#elimina" text="Elimina" />
                        </items>
                    </Menu>
                    <Menu text="Cambia Account">
                        <items>
                            <MenuItem fx:id="email1" text="filippo@hotmail.it" />
                            <MenuItem fx:id="email2" text="giancarlo@yahoo.it" />
                            <MenuItem fx:id="email3" text="alessandro@gmail.it" />
                        </items>
                    </Menu>
                </menus>
            </MenuBar>
        </children>
    </AnchorPane>
</children>

textArea.fxml

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="mailbox.TextAreaController">
<children>
    <AnchorPane> 
        <children>
            <TextArea fx:id="textarea" editable="false" layoutX="246.0" layoutY="255.0" prefHeight="144.0" prefWidth="350.0" />
        </children>
    </AnchorPane>
</children>

button.fxml

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mailbox.ButtonController">
<children>
    <AnchorPane> 
        <children>
            <Button id="scrivi" layoutX="268.0" layoutY="200.0" mnemonicParsing="false" prefHeight="27.0" prefWidth="65.0" text="Scrivi" />
            <Button id="reply" layoutX="342.0" layoutY="200.0" mnemonicParsing="false" prefHeight="27.0" prefWidth="65.0" text="Reply" />
            <Button id="replyall" layoutX="420.0" layoutY="200.0" mnemonicParsing="false" prefHeight="27.0" prefWidth="75.0" text="Reply-All" />
            <Button id="forward" layoutX="511.0" layoutY="200.0" mnemonicParsing="false" prefHeight="27.0" prefWidth="75.0" text="Forward" />
        </children>
    </AnchorPane>
</children>

textfield.fxml

<AnchorPane mouseTransparent="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mailbox.TextFieldController">
<children>
    <AnchorPane> 
        <children>
            <TextField fx:id="id" editable="false" layoutX="355.0" layoutY="39.0" mouseTransparent="false" prefHeight="27.0" prefWidth="35.0" />
            <TextField fx:id="mitt" editable="false" layoutX="355.0" layoutY="72.0" mouseTransparent="false" prefHeight="27.0" prefWidth="182.0" />
            <TextField fx:id="dest" editable="false" layoutX="355.0" layoutY="108.0" mouseTransparent="false" prefHeight="27.0" prefWidth="182.0" />
            <TextField fx:id="oggetto" editable="false" layoutX="355.0" layoutY="144.0" mouseTransparent="false" prefHeight="27.0" prefWidth="182.0" />
            <TextField fx:id="data" editable="false" layoutX="437.0" layoutY="39.0" mouseTransparent="false" prefHeight="27.0" prefWidth="100.0" />
            <Label layoutX="329.0" layoutY="44.0" text="ID:" />
            <Label layoutX="291.0" layoutY="77.0" text="Mittente:" />
            <Label layoutX="398.0" layoutY="44.0" text="Data:" />
            <Label layoutX="268.0" layoutY="113.0" text="Destinatario:" />
            <Label layoutX="292.0" layoutY="149.0" text="Oggetto:" />
        </children>
    </AnchorPane>
</children>

我使用Scene Builder制作了它们,我需要单独保存它们,因为我希望每个控制器使用单个文件。 编辑: Output

EDIT2: 这是第一个AnchorPane(在右侧您可以看到设置): SB1 这是第二个AnchorPane SB2 这是Textarea: enter image description here

1 个答案:

答案 0 :(得分:5)

AnchorPane是最差的布局之一(如果您正在设计响应式布局),因为在放置子级时,它不允许您考虑其他子级的大小(除非您使用监听器, / bindings以更新布局参数)。

在这种特定情况下,您的问题是您的button.fxml涵盖了其他fxml的所有内容,因此接收了所有MouseEvent。要显示fxml覆盖的区域,只需将此属性添加到button.fxml的根:style="-fx-background-color: rgba(0, 0, 255, 0.5)"

可能的解决方法是使子fxml尽可能小,并在父fxml中指定根位置:

确定内部layoutX的子级中的最小layoutY<AnchorPane>,为根设置这些值(或将其添加到根的先前值)并减去这些值来自内部<AnchorPane>的所有子项。

<!-- specify min layoutX/Y as position for root -->
<AnchorPane xmlns="http://javafx.com/javafx/8"
    xmlns:fx="http://javafx.com/fxml/1"
    layoutX="268"
    layoutY="200"
    fx:controller="mailbox.ButtonController">
    <children>
        <AnchorPane>
            <children>
                <!-- subtract root layoutX/Y from positions -->
                <Button id="scrivi" mnemonicParsing="false" prefHeight="27.0"
                    prefWidth="65.0" text="Scrivi" />
                <Button id="reply" layoutX="74" mnemonicParsing="false"
                    prefHeight="27.0" prefWidth="65.0" text="Reply" />
                <Button id="replyall" layoutX="152" mnemonicParsing="false"
                    prefHeight="27.0" prefWidth="75.0" text="Reply-All" />
                <Button id="forward" layoutX="243" mnemonicParsing="false"
                    prefHeight="27.0" prefWidth="75.0" text="Forward" />
            </children>
        </AnchorPane>
    </children>
</AnchorPane>

(与其他fxml相应地继续。)

这种方式仍然是一个糟糕的主意覆​​盖节点,因为您使用的是绝对位置,并且对fxml之一的任何修改都可能需要您更新多个其他以避免覆盖。更糟的是,根据操作系统/设置,外观看起来有所不同。对于一个操作系统,场景可能看起来不错,而在另一个操作系统上,您的节点可能会重叠。
因此,除非您100%确定节点大小已知,否则我建议避免使用绝对定位。最好使用BorderPane / HBox / VBox和/或GridPane ...

创建类似所示的场景。