Почему размер рабочей сцены приложения JavaFX отличается от предварительного просмотра построителя сцен

У меня проблема с представлением графического интерфейса приложения в Scene Builder по сравнению с его запуском.

Пользовательский интерфейс приложения в предварительном просмотре конструктора сцен выглядит следующим образом: Приложение в предварительном просмотре конструктора сцен выглядит так:

При запуске приложение выглядит так: введите здесь описание изображения

Таким образом, элементы определенно находятся в разных местах.

FXML:

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

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>


<BorderPane prefHeight="242.0" prefWidth="465.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
   <bottom>
      <Pane prefHeight="242.0" prefWidth="425.0" BorderPane.alignment="CENTER">
         <children>
            <TextField layoutX="45.0" layoutY="37.0" />
            <TextField layoutX="45.0" layoutY="112.0" />
            <Button layoutX="337.0" layoutY="178.0" mnemonicParsing="false" text="Button" />
         </children>
      </Pane>
   </bottom>
</BorderPane>

Основная.java:

package com.tempapp;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.fxml.FXMLLoader;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root1 = (BorderPane)FXMLLoader.load(getClass().getResource("LoginWindows.fxml"));
            Scene scene = new Scene(root1);
            scene.getStylesheets().add(getClass().getResource("LoginWindows.fxml").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
        System.out.println("HELLO");
    }
}

В чем причина того, что приложение выглядит иначе? Я попытался установить правильные значения высоты и ширины для сцены/сцены, но это не помогло. Это вызвано виртуальной машиной Java из-за некоторого масштабирования разрешения? У меня дисплей full hd.


person TheOmniano    schedule 14.11.2015    source источник


Ответы (1)


В SceneBuilder установите максимальную высоту и максимальную ширину на USE_PREF_SIZE. Точно так же вы также можете установить минимальные значения.

Кроме того, для такой сцены BorderPane может оказаться излишним. Вы можете легко использовать StackPane с VBox или даже GridPane.

!! Редактировать !!

Попробуй это:

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

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="180.0" prefWidth="260.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <VBox layoutX="45.0" layoutY="37.0" spacing="12.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <TextField fx:id="txtUserName" />
            <TextField fx:id="txtPassword" />
            <HBox>
               <children>
                  <Pane HBox.hgrow="ALWAYS" />
                  <Button fx:id="btnOk" mnemonicParsing="false" text="Button" />
               </children>
            </HBox>
         </children>
         <padding>
            <Insets bottom="18.0" left="18.0" right="18.0" top="18.0" />
         </padding>
      </VBox>
   </children>
</AnchorPane>
person RonSiven    schedule 18.11.2015
comment
Я нашел причину этой ситуации, масштабирование Windows отстой, после его отключения все работает нормально. Спасибо за помощь! - person TheOmniano; 19.11.2015
comment
Мне кажется, что если масштабирование так сильно влияет на ваш макет, возможно, ваш макет составлен неправильно. Попробуйте использовать VBox вместо позиционирования ваших текстовых полей с помощью layoutX и layoutY. - person RonSiven; 19.11.2015
comment
Отредактированный ответ с примером FXML. - person RonSiven; 19.11.2015