Forum Stats

  • 3,838,749 Users
  • 2,262,397 Discussions
  • 7,900,750 Comments

Discussions

-fx-skin not always used (The -fx-skin property has not been defined in CSS)

csh
csh Member Posts: 525
edited Apr 23, 2017 8:24PM in JavaFX 2.0 and Later

Hi,

I want to apply an alternative Skin to RadioButton. What I did is to add the following in my style sheet:

.radio-button {

    -fx-skin: "com.package.Class";

}

However, always the default skin is used (The stylesheet is loaded correctly as can be seen with other styles).

I then created a custom control:

public TestControl() {

  getStyleClass().add("test");

}

and tried the same:

.test {

    -fx-skin: "com.package.Class";

}

And JavaFX warns: "The -fx-skin property has not been defined in CSS".

ONLY when I define the (same) stylesheet in the overridden getUserAgentStylesheet it works and the control picks up the skin defined in the CSS.

If I apply the CSS in the Scene instead of the control, it doesn't pick up the style.

Is that by design?

How can I then apply a different Skin to existing controls, without deriving them and override getUserAgentStylesheet?

Answers

  • bouye-JavaNet
    bouye-JavaNet Member Posts: 394 Silver Badge
    edited Apr 18, 2017 8:41PM

    Hum, I never tried changing skin on the fly, but may be this is by design indeed. There is no info in the CSS reference guide beside the description of the selector and it sure does not tell when it is applied or not.

    May be it's worth to pop the question on the OpenJFX mailing list or to attempt to contact someone from the control team (Jonathan Gilles?) and ask him/her directly.

  • jsmith
    jsmith Member Posts: 2,856
    edited Apr 21, 2017 7:43PM

    I tried the following and it just worked for me, so I can't replicate your issue.

    I am using Java 8.  It may not work with Java 9 as it is deriving from a com.sun class as the base for the custom radio button skin and I don't think that will be allowed with Java 9.

    skinsample/custom-skin.css

    .radio-button {

       -fx-skin: "skinsample.CustomRadioButtonSkin";
    }

    -----

    skinsample/CustomRadioButtonSkin.java

    package skinsample;

    import com.sun.javafx.scene.control.skin.RadioButtonSkin;
    import javafx.scene.control.RadioButton;

    public class CustomRadioButtonSkin extends RadioButtonSkin {

       public CustomRadioButtonSkin(RadioButton radioButton) {

       super(radioButton);
       System.out.println("Custom radio skin used...");
       }

    }

    ------

    skinsample/SkinDemoApp.java

    package skinsample;

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.RadioButton;
    import javafx.stage.Stage;

    public class SkinDemoApp extends Application {

       @Override
       public void start(Stage stage) throws Exception {

      RadioButton radio = new RadioButton("Tokyo");

      final Scene scene = new Scene(radio);
       scene.getStylesheets().add(

       this.getClass().getResource("custom-skin.css").toExternalForm()

      );

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

       public static void main(String[] args) {

       launch(args);
       }

    }

  • bouye-JavaNet
    bouye-JavaNet Member Posts: 394 Silver Badge
    edited Apr 23, 2017 8:24PM

    @jsmith skins are going public in JDK9 so you'll simply have to change the import (if the public code does not change too much from the previous private version).

This discussion has been closed.