Элементы AnchorPane игнорируют щелчок мышью - PullRequest
0 голосов
/ 20 ноября 2018

Я инициализировал некоторые элементы, не являющиеся панелью привязки:

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

Но когда я пытаюсь щелкнуть на панели меню или в представлении списка, он не работает.Например, в этом случае я могу нажать на кнопки (возможно), потому что это последний элемент, который я инициализирую в конструкторе 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

РЕДАКТИРОВАТЬ2: Это первая AnchorPane (справа вы можете увидеть настройки): SB1 Это вторая AnchorPane SB2 Это текстовая область: enter image description here

1 Ответ

0 голосов
/ 20 ноября 2018

AnchorPane является одним из худших макетов, если вы разрабатываете адаптивный макет, поскольку он не позволяет учитывать размер других дочерних элементов при позиционировании дочернего элемента (кроме случаев, когда вы используете слушателей / привязки).обновить параметры макета.)

Ваша проблема в этом конкретном случае заключается в том, что ваш button.fxml охватывает все содержимое других fxmls и, следовательно, получает все MouseEvent s.Чтобы визуализировать область покрытия fxml, просто добавьте этот атрибут в корень button.fxml: style="-fx-background-color: rgba(0, 0, 255, 0.5)".

Возможный обходной путь - сделать дочерние fxmls настолько малыми, насколько это возможно, и указать корневую позицию вparent:

Определите минимальные 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>

(Действуйте соответственно с другими fxmls.)

Это все еще ужасная идея - наложить узлы таким образом, так как вы используетеабсолютные позиции и любая модификация одного из fxmls может потребовать обновления нескольких других, чтобы избежать наложений.Еще хуже выглядит по-разному в зависимости от ОС / настроек.Для одной ОС сцена может выглядеть нормально, а для другой ваши узлы могут перекрываться.
По этой причине я рекомендую избегать использования абсолютного позиционирования, если вы не уверены на 100%, что размеры узлов известны.Сцена, подобная показанной, лучше создавать с использованием BorderPane / HBox / VBox и / или GridPane ...

...