Discussions
Categories
- 197K All Categories
- 2.5K Data
- 546 Big Data Appliance
- 1.9K Data Science
- 450.8K Databases
- 221.9K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 552 MySQL Community Space
- 479 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3.1K ORDS, SODA & JSON in the Database
- 556 SQLcl
- 4K SQL Developer Data Modeler
- 187.2K SQL & PL/SQL
- 21.4K SQL Developer
- 296.3K Development
- 17 Developer Projects
- 139 Programming Languages
- 293K Development Tools
- 110 DevOps
- 3.1K QA/Testing
- 646.1K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 158 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.2K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 19 Java Essentials
- 162 Java 8 Questions
- 86K Java Programming
- 81 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 205 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 468 LiveLabs
- 39 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 175 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 233 Portuguese
-fx-skin not always used (The -fx-skin property has not been defined in CSS)

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
-
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.
-
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);
}}
-
@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).