Почему создание экземпляра элемента управления JavaFX повреждает макет - PullRequest
7 голосов
/ 07 ноября 2019

Я пытаюсь создать простое приложение ввода данных с javafx и столкнулся с проблемой при добавлении элемента управления сцены. Дисплей теряет свой цвет заливки даже ДО того, как я добавил элемент управления на сцену! Простое создание экземпляра элемента управления нарушает его.

Я работал на Oracle Java 8 на Windows, но я пробовал OpenJDK 8 на Windows и OpenJDk / OpenJFX 13 на Linux, и все ведут себя одинаково. Я раздобыл код для мимиума медведя, чтобы воссоздать проблему.

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class BasicTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Rectangle r = new Rectangle();
        r.setWidth(200);
        r.setHeight(50);
        r.setFill(Color.BLUE);
        r.setStroke(Color.WHITE);
        r.setStrokeWidth(2);

        Text t = new Text();
        t.setText("Confirm");
        t.setFill(Color.WHITE);
        t.setFont(Font.font("null", 40));

        StackPane sp = new StackPane(r);
        sp.getChildren().add(t);
        sp.setMaxWidth(200);

        t.setTranslateY(-2);

        Label b = new Label("Click me");//Comment this line out after first run

        Scene scene = new Scene(sp, 300, 200);
        scene.setFill(Color.BLUE);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

С закомментированной меткой фон сцены синий, поэтому я получаю белое «Подтверждение» с белым контуром. Просто добавив конструктор меток, фон сцены станет серым.

1 Ответ

4 голосов
/ 08 ноября 2019

Спасибо за все комментарии. Много извинений, если моя формулировка сбивает с толку. Я добавил несколько изображений, чтобы показать разницу, но они, похоже, исчезли. В любом случае, моя благодарность @Matt за их очень краткое описание (о котором я хотел бы подумать!). Мне также нравится идея щелчка мышью.

Я, вероятно, очень капризно задавал этот "вопрос" на SO, когда я твердо уверен, что это ошибка в javafx. На мой взгляд, создание объекта, который находится далеко от (пока) графа сцены, не должен иметь никакого влияния на него - CSS или вообще без CSS. Я подниму ошибку в javafx.

Однако я знал, что сила SO поможет мне, и это так! Благодаря подсказке @jewelsea я просто заменил свою scene.setFill () (которая в любом случае была всего лишь тестом) на CSS, и проблема обошлась. Теперь я даже могу добавить элемент управления на сцену, и он работает как положено. Из Справочного руководства по JavaFX CSS:

"Объект Scene не имеет настраиваемых свойств CSS и не имеет псевдоклассов. Однако корневому узлу сцены назначается класс стиля" root "(в дополнениедля стилей классов, уже назначенных узлу). "

Поэтому я настроил в своем css:

.root {
    -fx-background-color: blue;
}

Еще один способ обойти это - просто установить фон StackPane в СИНИЙ. :

sp.setBackground(new Background(new BackgroundFill(Color.BLUE, null, null)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...