У меня есть простое приложение на 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 да, это может помочь. Я думал, что есть более элегантное решение...
Опубликуйте свой FXML. Не пытайтесь использовать идею @nicomp.
Я предполагаю, что вы установили минимальную высоту на дочернем узле.
@Sedrick добавил fxml
@nicomp API-интерфейсы GUI JavaFX являются высокоуровневыми и предназначены для обработки большинства ситуаций, если вы правильно используете узлы макета.
Вы, вероятно, столкнетесь с большим количеством проблем с вашим текущим макетом. Если изменится ширина экрана (возможно), если изменится разрешение экрана и если изменится размер шрифта (возможно).
Все эти AnchorPane предназначены исключительно для создания этих прямоугольных форм? мне кажется, что вы могли бы сделать это только с BorderPane + VBox (включая кнопки) ...




Ваша проблема в полях, которые вы установили на своем 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>
Большое спасибо, это выглядит более элегантно.
Решение грубой силы: вычислить новое местоположение кнопки внутри события изменения размера окна, используя новый размер окна.