JavaFX и Scene Builder обрезают края сцены, несмотря на указание USE_COMPUTED_SIZE - PullRequest
6 голосов
/ 28 марта 2019

Я использую Scene Builder (v11.0.0) для создания файлов FXML для сцен в JavaFX (v12), но, несмотря на указание всех контейнеров на USE_COMPUTED_SIZE для предпочтительной ширины и высоты, отрисовываемых сцен (как видно в SceneBuilder, а также при запуске в качестве приложения JavaFX, которое загружает эти файлы FXML), обрезаются по правому и нижнему краям, так что биты узлов обрезаются.

А в Scene Builder кажется, что средство визуализации должно знатьчто сцена не будет соответствовать разрешенным границам, потому что редактор показывает синие маркеры границ, которые явно находятся за пределами отрисованного прямоугольника.

Просмотр в Scene Builder

Screenshot of the view in Scene Builder, showing the form design has been clipped at the right and bottom edges, followed by a dark boundary showing where the content ought to be, and then blue boundary markers showing the extent of that boundary.

Представление в Scene Builder показывает, что в нижней части требуется больше места, чтобы обеспечить кнопкам достаточно места (их нижний край и нижний край TitledPane отсутствуют).И больше места необходимо справа, чтобы соответствовать правым краям DatePicker и TitledPane.Синие маркеры границ четко показывают, где заканчивается фактический контент, поэтому неясно, почему область отображения рассчитывается на несколько пикселей короче этого.

Вид запущенного приложения Java

Screenshot of the scene rendered within a Java application, the form design clipped at the right and bottom edges, very similar to the degree of clipping seen in Scene Builder.

Как только файлы FXML используются для заполнения окна в приложении JavaFX, видно то же самое: вычисленный размер для окна равен числу пикселей, слишком маленькому, чтобы соответствоватьвся сцена правильно.

Если синие граничные маркеры были правильно рассчитаны, чтобы показать, что необходимы дополнительная ширина и высота области отображения, как я скажу FXML требовать это дополнительное пространство при рендеринге?

Это известная ошибка / ограничение в Scene Builder, FXML или JavaFX.Или мне нужно сделать что-то еще, кроме выбора USE_COMPUTED_SIZE для предпочтительных размеров?

Чтобы сделать это явным, см. Пример FXML ниже, который отображает проиллюстрированную проблему.

scene.fxml

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <TitledPane animated="false" collapsible="false" text="untitled">
        <content>
            <HBox>
               <children>
                  <fx:include source="subscene.fxml" />
               </children>
            </HBox>
        </content>
      </TitledPane>
      <TitledPane animated="false" collapsible="false" text="untitled">
        <content>
            <HBox>
               <children>
                  <fx:include source="subscene.fxml" />
               </children>
            </HBox>
        </content>
      </TitledPane>
      <TitledPane animated="false" collapsible="false" text="untitled">
        <content>
            <HBox alignment="BASELINE_RIGHT">
               <children>
                  <Button mnemonicParsing="false" text="Button" />
                  <Button mnemonicParsing="false" text="Button" />
               </children>
            </HBox>
        </content>
      </TitledPane>
   </children>
</VBox>

subscene.fxml

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

<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>


<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label text="Label" />
      <DatePicker />
   </children>
</VBox>

1 Ответ

2 голосов
/ 30 марта 2019

Это похоже на ошибку в JavaFX, в частности DatePicker, так как этот простой пример может воспроизвести проблему:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {   
        VBox root = new VBox(new DatePicker());

        // Problem shows up when using USE_COMPUTED_SIZE (the default) as well
        root.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
        root.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);

        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

}

В результате:

image showing improperly sized date picker parent

Примечание. Похоже, не имеет значения, в какой родительский элемент вставлен DatePicker. Также не возникает проблема с другими элементами управления.

Обходной путь к этой проблеме, кажется, вызывает Window.sizeToScene() после вызова show(). Я не понимаю, почему это будет иметь значение, но это так. К сожалению, это поможет только в реальном приложении, а не в Scene Builder.

...