JavaFX отличается поведением между использованием FXML и прямой Java - PullRequest
0 голосов
/ 06 марта 2019

Я довольно новичок в JavaFX и учусь манипулировать окнами при изменении размеров. Моя цель - иметь окно, содержащее 4 подокна, размер которых изменяется, в то время как размер главного окна изменяется.

Прилагаются 2 минимальных, полных, проверяемых теста. Первый mcv1 использует Java для создания окна, второй mcv2 использует fxml, который был создан с помощью Scene Builder. Они были разработаны с использованием Eclipse и должны быть запущены оттуда.

При использовании mcv1 размер окна корректно (см. Outputmcv1.jpg), в то время как mcv2 размер окна перестает изменяться (см. Outputmcv2.jpg). Под окна перестают расширяться.

Реальный вопрос: есть ли в FXML что-то, что препятствует расширению узлов? Я хочу использовать FXML, чтобы иметь поддержку мультиязычности, но этот эксперимент может перевести меня на нативный код Java.

outputmcv1.jpg

outputmcv1.jpg[1]

outputmcv2.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-файле, но я не могу понять, как его опубликовать. Есть мысли?

1 Ответ

0 голосов
/ 06 марта 2019

Я вручную удалил ограничения на столбцы и строки, сгенерированные Scene Builder. Подокна теперь правильно раскрываются.

...