CSS style class rendering bug

Kevin Rushforth kevin.rushforth at oracle.com
Wed Aug 2 15:03:18 UTC 2017


Yes, this might be the same bug. The incident triage team independently 
confirmed that this is a regression introduced in 8u102. Btw, the bug is 
now available on bugs.openjdk.java.net here:

https://bugs.openjdk.java.net/browse/JDK-8185709

-- Kevin


Fisher, Robert [ext] wrote:
> 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