JavaFX: переместить элемент в окне (сцене), изменить размер

У меня есть простое приложение на JavaFX, оно состоит из нескольких панелей и кнопок. Я не могу понять, как заставить кнопку двигаться при изменении размера сцены. Итак, я хочу, чтобы левая нижняя кнопка всегда была видна даже при изменении размера окна. JavaFX: переместить элемент в окне (сцене), изменить размер

вот обзор узлов:

JavaFX: переместить элемент в окне (сцене), изменить размер

вот fxml:

<?xml version = "1.0" encoding = "UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.geometry.Point3D?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>


<AnchorPane maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "750.0" prefWidth = "1000.0" xmlns = "http://javafx.com/javafx/9.0.4" xmlns:fx = "http://javafx.com/fxml/1">
   <children>
      <BorderPane layoutX = "89.0" layoutY = "64.0" prefHeight = "400.0" prefWidth = "600.0" AnchorPane.bottomAnchor = "0.0" AnchorPane.leftAnchor = "0.0" AnchorPane.rightAnchor = "0.0" AnchorPane.topAnchor = "0.0">
         <left>
            <AnchorPane prefHeight = "150.0" prefWidth = "150.0" style = "-fx-background-color: #4059a9 #4059a9;" BorderPane.alignment = "CENTER">
               <children>
                  <AnchorPane prefHeight = "750.0" prefWidth = "75.0" style = "-fx-background-color: #2b4496 #2b4496;" AnchorPane.bottomAnchor = "0.0" AnchorPane.leftAnchor = "0.0" AnchorPane.rightAnchor = "75.0" AnchorPane.topAnchor = "0.0">
                     <children>
                        <VBox alignment = "CENTER" prefHeight = "750.0" prefWidth = "75.0" spacing = "35.0" AnchorPane.bottomAnchor = "0.0" AnchorPane.leftAnchor = "0.0" AnchorPane.rightAnchor = "0.0" AnchorPane.topAnchor = "0.0">
                           <children>
                              <JFXButton contentDisplay = "GRAPHIC_ONLY" prefWidth = "82.0" VBox.vgrow = "ALWAYS">
                                 <graphic>
                                    <FontAwesomeIconView fill = "WHITE" glyphName = "HOME" size = "2em" />
                                 </graphic>
                                 <VBox.margin>
                                    <Insets top = "25.0" />
                                 </VBox.margin>
                              </JFXButton>
                              <JFXButton contentDisplay = "GRAPHIC_ONLY" prefWidth = "75.0">
                                 <VBox.margin>
                                    <Insets bottom = "10.0" top = "600.0" />
                                 </VBox.margin>
                                 <graphic>
                                    <FontAwesomeIconView fill = "WHITE" glyphName = "SIGN_OUT" size = "2em" />
                                 </graphic>
                                 <opaqueInsets>
                                    <Insets />
                                 </opaqueInsets>
                              </JFXButton>
                           </children>
                        </VBox>
                     </children>
                     <rotationAxis>
                        <Point3D />
                     </rotationAxis>
                  </AnchorPane>
               </children>
            </AnchorPane>
         </left>
      </BorderPane>
   </children>
</AnchorPane>

Решение грубой силы: вычислить новое местоположение кнопки внутри события изменения размера окна, используя новый размер окна.

nicomp 31.01.2019 16:43

@nicomp да, это может помочь. Я думал, что есть более элегантное решение...

Tymur Berezhnoi 31.01.2019 16:44

Опубликуйте свой FXML. Не пытайтесь использовать идею @nicomp.

Sedrick 31.01.2019 16:44

Я предполагаю, что вы установили минимальную высоту на дочернем узле.

Sedrick 31.01.2019 16:46

@Sedrick добавил fxml

Tymur Berezhnoi 31.01.2019 16:49

@nicomp API-интерфейсы GUI JavaFX являются высокоуровневыми и предназначены для обработки большинства ситуаций, если вы правильно используете узлы макета.

Sedrick 31.01.2019 16:57

Вы, вероятно, столкнетесь с большим количеством проблем с вашим текущим макетом. Если изменится ширина экрана (возможно), если изменится разрешение экрана и если изменится размер шрифта (возможно).

Sedrick 31.01.2019 17:02

Все эти AnchorPane предназначены исключительно для создания этих прямоугольных форм? мне кажется, что вы могли бы сделать это только с BorderPane + VBox (включая кнопки) ...

fabian 31.01.2019 17:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
1 663
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваша проблема в полях, которые вы установили на своем Buttons. Следуйте этому макету. Я использовал HBox в качестве корневого узла.

<?xml version = "1.0" encoding = "UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>


<HBox maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "700.0" prefWidth = "1000.0" xmlns = "http://javafx.com/javafx/8.0.141" xmlns:fx = "http://javafx.com/fxml/1">
   <children>
      <VBox alignment = "CENTER" prefWidth = "75.0" style = "-fx-background-color: #2b4496 #2b4496;">
         <children>
            <JFXButton contentDisplay = "GRAPHIC_ONLY" prefWidth = "82.0" VBox.vgrow = "ALWAYS">
               <graphic>
                  <FontAwesomeIconView fill = "WHITE" glyphName = "HOME" size = "2em" />
               </graphic>
               <VBox.margin>
                  <Insets top = "25.0" />
               </VBox.margin>
            </JFXButton>
            <Button maxHeight = "1.7976931348623157E308" maxWidth = "1.7976931348623157E308" mnemonicParsing = "false" opacity = "0.0" VBox.vgrow = "ALWAYS" />
            <JFXButton contentDisplay = "GRAPHIC_ONLY" prefWidth = "75.0">
               <VBox.margin>
                  <Insets bottom = "25.0" />
               </VBox.margin>
               <graphic>
                  <FontAwesomeIconView fill = "WHITE" glyphName = "SIGN_OUT" size = "2em" />
               </graphic>
               <opaqueInsets>
                  <Insets />
               </opaqueInsets>
            </JFXButton>
         </children>
      </VBox>
      <VBox prefHeight = "200.0" prefWidth = "75.0" style = "-fx-background-color: #4059a9 #4059a9;" />
      <AnchorPane prefHeight = "200.0" prefWidth = "200.0" HBox.hgrow = "ALWAYS" />
   </children>
</HBox>

<?xml version = "1.0" encoding = "UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>


<BorderPane maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" xmlns = "http://javafx.com/javafx/8.0.111" xmlns:fx = "http://javafx.com/fxml/1">
   <left>
      <VBox BorderPane.alignment = "CENTER">
         <children>
            <Button mnemonicParsing = "false" text = "Button" />
            <AnchorPane VBox.vgrow = "ALWAYS" />
            <Button mnemonicParsing = "false" text = "Button" />
         </children>
      </VBox>
   </left>
</BorderPane>

Добавьте пустую панель в середину с параметром VGROW, установленным на ВСЕГДА.

Ответ принят как подходящий

Похоже, вы могли бы добиться того же эффекта, используя BorderPane и VBox с наложенными фоновыми заливками и Region, который всегда вставляется между вашими кнопками:

<?xml version = "1.0" encoding = "UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.Region?>

<BorderPane prefHeight = "750.0" prefWidth = "1000.0"
    xmlns = "http://javafx.com/javafx/9.0.4"
    xmlns:fx = "http://javafx.com/fxml/1">
    <left>
        <VBox alignment = "TOP_LEFT"
            spacing = "35.0"
            style = "-fx-background-color: #2b4496, #4059a9; -fx-background-insets: 0, 0 0 0 75;"> <!-- overlay 2 backgrounds produce rectangles -->
            <padding>
                <Insets right = "75.0" />
            </padding>
            <children>
                <JFXButton contentDisplay = "GRAPHIC_ONLY" prefWidth = "82.0"  VBox.vgrow = "NEVER">
                    <graphic>
                        <FontAwesomeIconView fill = "WHITE" glyphName = "HOME" size = "2em" />
                     </graphic>
                     <VBox.margin>
                        <Insets top = "25.0" />
                     </VBox.margin>
                  </JFXButton>
                  <Region VBox.vgrow = "ALWAYS" /> <!-- filler -->
                  <JFXButton contentDisplay = "GRAPHIC_ONLY" prefWidth = "75.0" VBox.vgrow = "NEVER">
                     <VBox.margin>
                        <Insets bottom = "10.0" />
                     </VBox.margin>
                     <graphic>
                        <FontAwesomeIconView fill = "WHITE" glyphName = "SIGN_OUT" size = "2em" />
                     </graphic>
                 </JFXButton>
            </children>
        </VBox>
    </left>
</BorderPane>

Большое спасибо, это выглядит более элегантно.

Tymur Berezhnoi 31.01.2019 20:08

Другие вопросы по теме