Я довольно новичок в JavaFX и учусь манипулировать окнами при изменении размеров. Моя цель - иметь окно, содержащее 4 подокна, размер которых изменяется, в то время как размер главного окна изменяется.
Прилагаются 2 минимальных, полных, проверяемых теста. Первый mcv1 использует Java для создания окна, второй mcv2 использует fxml, который был создан с помощью Scene Builder. Они были разработаны с использованием Eclipse и должны быть запущены оттуда.
При использовании mcv1 размер окна корректно (см. Outputmcv1.jpg), в то время как mcv2 размер окна перестает изменяться (см. Outputmcv2.jpg). Под окна перестают расширяться.
Реальный вопрос: есть ли в FXML что-то, что препятствует расширению узлов? Я хочу использовать FXML, чтобы иметь поддержку мультиязычности, но этот эксперимент может перевести меня на нативный код Java.
outputmcv1.jpg
outputmcv2.jpg
Файлы кодов: Mcv1
Mcv1.java
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Mcv1 extends Application {
public Mcv1() {
}
@Override
public void start(Stage stage) throws Exception {
Group root = new Group();
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("borders.css").toExternalForm());
GridPane grid = new GridPane();
AnchorPane menu = new AnchorPane();
MenuBar bar = new MenuBar();
Menu fileMenu = new Menu("File");
bar.getMenus().add(fileMenu);
menu.getChildren().add(bar);
AnchorPane leftTop = new AnchorPane();
leftTop.getStyleClass().add("red-border");
AnchorPane leftBottom = new AnchorPane();
leftBottom.getStyleClass().add("yellow-border");
AnchorPane rightTop = new AnchorPane();
rightTop.getStyleClass().add("blue-border");
AnchorPane rightBottom = new AnchorPane();
rightBottom.getStyleClass().add("green-border");
root.getChildren().add(grid);
grid.add(menu, 0, 0);
grid.add(leftTop,0,1);
grid.add(leftBottom,0,2);
grid.add(rightTop,1,1);
grid.add(rightBottom,1,2);
// Creating a scene object
scene.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneWidth,Number newSceneWidth) {
Double widthD = newSceneWidth.doubleValue();
leftTop.setPrefWidth(widthD*0.4);
rightTop.setPrefWidth(widthD*0.6);
leftBottom.setPrefWidth(widthD*0.4);
rightBottom.setPrefWidth(widthD*0.6);
leftTop.setMaxWidth(widthD*0.4);
rightTop.setMaxWidth(widthD*0.6);
leftBottom.setMaxWidth(widthD*0.4);
rightBottom.setMaxWidth(widthD*0.6);
}
});
scene.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneHeight,Number newSceneHeight) {
Double heightD = newSceneHeight.doubleValue();
leftTop.setPrefHeight(heightD*0.6);
rightTop.setPrefHeight(heightD*0.6);
leftBottom.setPrefHeight(heightD*0.4);
rightBottom.setPrefHeight(heightD*0.4);
leftTop.setMaxHeight(heightD*0.6);
rightTop.setMaxHeight(heightD*0.6);
leftBottom.setMaxHeight(heightD*0.4);
rightBottom.setMaxHeight(heightD*0.4);
}
});
// Setting title to the Stage
stage.setTitle("Jungle Finance");
// Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
} public static void main(String args[]){
launch();
}
}
boders.css
red-border {
-fx-background-color:red;
}
.green-border {
-fx-background-color:green;
}
.yellow-border {
-fx-background-color:yellow;
}
.blue-border {
-fx-background-color:blue;
}
код Mcv2
Mcv2.java
package com.mcv2;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Mcv2 extends Application {
public Mcv2() {
}
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));
Parent root = loader.load();
ScreenController controller = loader.getController();
Scene scene = new Scene(root);
// Creating a scene object
scene.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneWidth,Number newSceneWidth) {
controller.setWidth(newSceneWidth);
}
});
scene.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneHeight,Number newSceneHeight) {
controller.setHeight(newSceneHeight);
}
});
// Setting title to the Stage
stage.setTitle("Jungle Finance");
// Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch();
}
}
ScreenController.java
package com.mcv2;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.AnchorPane;
public class ScreenController implements Initializable {
@FXML
private MenuBar menuBar;
@FXML
private AnchorPane leftTop;
@FXML
private AnchorPane leftBottom;
@FXML
private AnchorPane rightTop;
@FXML
private AnchorPane rightBottom;
public ScreenController() {
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
}
@FXML
private void window2Resized() {
}
@FXML
private void fileOpenMenu () {
}
public void setWidth(Number width) {
Double widthD = width.doubleValue();
leftTop.setPrefWidth(widthD*0.4);
rightTop.setPrefWidth(widthD*0.6);
leftBottom.setPrefWidth(widthD*0.4);
rightBottom.setPrefWidth(widthD*0.6);
leftTop.setMaxWidth(widthD*0.4);
rightTop.setMaxWidth(widthD*0.6);
leftBottom.setMaxWidth(widthD*0.4);
rightBottom.setMaxWidth(widthD*0.6);
menuBar.setPrefWidth(widthD);
}
public void setHeight(Number height) {
Double heightD = height.doubleValue();
leftTop.setPrefHeight(heightD*0.6);
rightTop.setPrefHeight(heightD*0.6);
leftBottom.setPrefHeight(heightD*0.4);
rightBottom.setPrefHeight(heightD*0.4);
leftTop.setMaxHeight(heightD*0.6);
rightTop.setMaxHeight(heightD*0.6);
leftBottom.setMaxHeight(heightD*0.4);
rightBottom.setMaxHeight(heightD*0.4);
}
}
MainScreen.fxml
?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<GridPane fx:id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onDragDetected="#window2Resized" onDragDone="#window2Resized" onDragDropped="#window2Resized" onDragEntered="#window2Resized" onDragExited="#window2Resized" onDragOver="#window2Resized" onMouseDragEntered="#window2Resized" onMouseDragExited="#window2Resized" onMouseDragOver="#window2Resized" onMouseDragReleased="#window2Resized" onTouchMoved="#window2Resized" onTouchPressed="#window2Resized" onTouchReleased="#window2Resized" onTouchStationary="#window2Resized" prefHeight="507.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.mcv2.ScreenController">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="294.0" minWidth="10.0" prefWidth="140.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="460.0" minWidth="10.0" prefWidth="460.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="249.0" minHeight="10.0" prefHeight="54.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="403.0" minHeight="10.0" prefHeight="375.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="479.0" minHeight="10.0" prefHeight="105.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnSpan="2">
<children>
<MenuBar fx:id="menuBar" layoutY="2.0" prefHeight="25.0" prefWidth="346.0">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem fx:id="fileOpen" mnemonicParsing="false" onAction="#fileOpenMenu" onMenuValidation="#fileOpenMenu" text="Open" />
<MenuItem mnemonicParsing="false" text="Save" />
<MenuItem mnemonicParsing="false" text="Save As" />
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Window">
<items>
<MenuItem mnemonicParsing="false" text="New" />
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="Index" />
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</children>
</AnchorPane>
<AnchorPane fx:id="leftTop" prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: red;" GridPane.rowIndex="1" />
<AnchorPane fx:id="rightTop" prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: blue;" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<AnchorPane fx:id="leftBottom" prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: yellow;" GridPane.rowIndex="2" />
<AnchorPane fx:id="rightBottom" prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: green;" GridPane.columnIndex="1" GridPane.rowIndex="2" />
</children>
</GridPane>
Последний вопрос. У меня есть весь код с настройками Eclipse в zip-файле, но я не могу понять, как его опубликовать. Есть мысли?