JFXtras / jfxtras-styles

Java, JavaFX themes or look and feels. Currently contains JMetro theme.
https://pixelduke.com/java-javafx-theme-jmetro/
643 stars 144 forks source link

The setFill for the Text component does not execute correctly #230

Closed yuan236 closed 5 months ago

yuan236 commented 6 months ago

Java version: 21 JMetro version: 11.6.16

Good code

    public void start(Stage stage) throws IOException {
        Text text = new Text("Hello World");
        text.setX(100);
        text.setY(100);

        Pane pane = new Pane();
        pane.setStyle("-fx-background-color: #212121");
        Scene scene = new Scene(pane, 500, 400);
        JMetro jMetro = new JMetro(Style.DARK);
        jMetro.setScene(mainScene);
        stage.setScene(scene);
        // Add text to pane before stage.show()
        pane.getChildren().add(text);
        stage.show();

        text.setFill(Color.RED);
    }

Bad code

    public void start(Stage stage) throws IOException {
        Text text = new Text("Hello World");
        text.setX(100);
        text.setY(100);

        Pane pane = new Pane();
        pane.setStyle("-fx-background-color: #212121");
        Scene scene = new Scene(pane, 500, 400);
        JMetro jMetro = new JMetro(Style.DARK);
        jMetro.setScene(scene);
        stage.setScene(scene);
        stage.show();

        // Add text to pane after stage.show()
        pane.getChildren().add(text);
        text.setFill(Color.RED);
    }
dukke commented 6 months ago

Hi @yuan236

Thanks for the report.

Can you be more descriptive in your issue report? What happens and what would you like to happen? What exactly is the issue?

I'm going to guess that the issue is that "Bad code" doesn't work like "Good code" even though they seem to be functionally similar. If that's the case it is likely a JavaFX issue and not a JMetro issue as JMetro doesn't change anything that would alter the way styles are applied when adding Nodes after the Stage is shown...

JMetro sets a user agent stylesheet and that should define the styles for any node that is already in the stage or any node that's added afterwards in the future. Perhaps you might want to try forcing the css parser to run again (something like calling the applyCss() method).

Thanks!

yuan236 commented 6 months ago

Hi @dukke , sorry my English is so bad. In using JMetro, If I use 'JMetro jMetro = new JMetro(Style.DARK);jMetro.setScene(scene);' and 'pane.getChildren().add(text)' after a 'stage.show()', 'text.setFill()' will no longer have any effect. it's like 'Bad Code'.

dukke commented 5 months ago

Hi again,

Sorry for the late reply.

That's actually to be expected.

I said before that JMetro sets a "user agent stylesheet", I actually meant that it sets a Scene stylesheet. Look at the CSS reference documentation, in the "Scene, Parent and SubScene Stylesheets" section: https://openjfx.io/javadoc/22/javafx.graphics/javafx/scene/doc-files/cssref.html

So if you want to override in code a style set in a Scene stylesheet you need to call "setStyle(...)"

Thanks!