Как проверить, сталкиваются ли два или более элемента в макете JavaFx - PullRequest
0 голосов
/ 19 ноября 2018

Я сделал этот простой почтовый клиент, но у него есть проблема: когда я устанавливаю элементы в AnchorPane, он устанавливает только последний, так что я думаю, что есть проблема неправильных мер.Я проверял это более одного раза, но, как вы можете видеть, элементы хорошо разделены: mailbox

Вот как я помещаю элементы в Anchor Pane:

public void start(Stage stage) throws Exception {
    FXMLLoader listLoader = new FXMLLoader(getClass().getResource("lista.fxml"));
    FXMLLoader textareaLoader = new FXMLLoader(getClass().getResource("textarea.fxml"));
    FXMLLoader fieldLoader = new FXMLLoader(getClass().getResource("textfield.fxml"));
    FXMLLoader menuLoader = new FXMLLoader(getClass().getResource("menubar.fxml"));
    FXMLLoader buttonLoader = new FXMLLoader(getClass().getResource("button.fxml"));

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

А это файлы FXML со всеми координатами:

List.fxml

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

Панель меню

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="mailbox.MenuBarController">
    <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>

TextArea

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

TextField

<AnchorPane mouseTransparent="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mailbox.TextFieldController">
   <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>

Кнопка

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mailbox.ButtonController">
   <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>

1 Ответ

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

Синий представляет AnchorPane кнопки.fxml

Я добавил синий цвет фона к button.fxml AnchorPane.

Проблема в layoutXи layoutY кнопок;координаты кнопок рассчитываются относительно верхнего левого угла вмещающего AnchorPane из button.fxml, а не относительно AnchorPane из list.xml.Это приводит к тому, что AnchorPane скрывает компоненты позади него (как видно по синему цвету), и, следовательно, события ввода от мыши потребляются AnchorPane.

Для решения проблемы (есть лучшие способы размещениякроме этого, просто исправление adhoc) используйте этот код в button.fxml

<AnchorPane style="-fx-background-color: blue;" layoutX="268.0" layoutY="200.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mailbox.ButtonController">
    <HBox><children>
        <Button id="scrivi" mnemonicParsing="false" prefHeight="27.0" prefWidth="65.0" text="Scrivi" />
        <Button id="reply"  mnemonicParsing="false" prefHeight="27.0" prefWidth="65.0" text="Reply" />
        <Button id="replyall"  mnemonicParsing="false" prefHeight="27.0" prefWidth="75.0" text="Reply-All" />
        <Button id="forward"  mnemonicParsing="false" prefHeight="27.0" prefWidth="75.0" text="Forward" />
    </children>
    </HBox>
</AnchorPane>

Приведенный выше код начнет раскладывать ваши кнопки там, где вы ожидали, и для простоты я обернул их в Vbox.

Что касается проверки столкновения 2 узлов, используйте это

public static boolean isCollide(Node x, Node y){
            Bounds RectA = x.localToScene(x.getBoundsInLocal());
            Bounds RectB = y.localToScene(y.getBoundsInLocal());

            return RectB.intersects(RectA);
}
...