CSS style class rendering bug
Fisher, Robert [ext]
robert.fisher.ext at zeiss.com
Wed Aug 2 08:18:23 UTC 2017
Could be the same as this bug here which was a regression in 8u102:
https://bugs.openjdk.java.net/browse/JDK-8183100
A workaround is to call Node#impl_reapplyCSS on the parent *after* putting the child back in the scene. But this isn't public API and is removed in Java 9, so you can alternatively just add and remove a dummy style class i.e.
field.getStyleClass().add("blah")
field.getStyleClass().remove("blah")
which may still work in 9.
Cheers,
Rob
-----Original Message-----
From: openjfx-dev [mailto:openjfx-dev-bounces at openjdk.java.net] On Behalf Of adam at adamish.com
Sent: Dienstag, 1. August 2017 16:09
To: openjfx-dev at openjdk.java.net
Subject: CSS style class rendering bug
(https://stackoverflow.com/questions/45440102/javafx-css-class-not-removed-when-node-disconnected)
I appeared to have discovered a case in JavaFX (8u144, running on Windows 7) where a TextField is rendered using the wrong style class.
This only appears to happen in the following situation
* style class removed whilst Node not attached to Scene AND
* parent `GridPane` has a style-class assigned, even if that class doesn't have content.
I've separated the issue from a larger application into the following contrived example:
public class RenderBug extends Application {
private static final String ERROR = "error";
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
TextField field = new TextField();
GridPane grid = new GridPane();
grid.getStyleClass().add("some-random-class");
grid.add(field, 0, 0);
StackPane stack = new StackPane(grid);
Scene scene = new Scene(stack);
scene.getStylesheets().add("/foo.css");
primaryStage.setWidth(300);
primaryStage.setHeight(300);
primaryStage.setScene(scene);
primaryStage.show();
Timeline line = new Timeline();
line.getKeyFrames().add(new
KeyFrame(Duration.seconds(4), event -> {
field.getStyleClass().add(ERROR);
}));
line.getKeyFrames().add(new
KeyFrame(Duration.seconds(5), event -> {
stack.getChildren().remove(grid);
}));
line.getKeyFrames().add(new
KeyFrame(Duration.seconds(6), event -> {
field.getStyleClass().remove(ERROR);
}));
line.getKeyFrames().add(new
KeyFrame(Duration.seconds(7), event -> {
stack.getChildren().add(grid);
System.out.println(field.getStyleClass());
}));
line.play();
}
}
foo.css
.text-field.error {
-fx-background-color: red;
}
.some-random-class {
/** no content required */
}
Screenshot. At this point TextField is red, even though the class "error" has been removed. Even interacting with the field, resizing window etc. does not fix the issue.
[![TextField shown with red][1]][1]
Is this a genuine bug? or am I doing something wrong? I can't find any documentation to hint that style-classes cannot or shouldn't be updated "offline"
[1]: https://i.stack.imgur.com/ZPEYi.png
More information about the openjfx-dev
mailing list