I've been inspecting the "caspian.css" distributed by Oracle in the JavaFX runtime library, and I see they have declared some color values as variables. Eg:
-fx-base: #d0d0d0; // Caspian.css, Line 47
...and then they used it as value of some other property, like:
-fx-color: -fx-base; // Caspian.css, Line 96
Now, what I want to do is to declare a measurement unit (-fx-radius-default: 10px
) and then use it everytime I need to set radius of a control, for instance:
-fx-border-radius: -fx-radius-default;
-fx-background-radius: -fx-radius-default;
I have been unsuccessful so far. My question is: Is this possible, at all?
Edit: Adding experiment details
Details
Here is my Experiment.fxml file that I created on JavaFX Scene Builder 1.1:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
<children>
<TextArea layoutX="200.0" layoutY="119.0" prefWidth="200.0" styleClass="track" wrapText="true" />
</children>
<stylesheets>
<URL value="@css/Experiment.css" />
</stylesheets>
</AnchorPane>
And below is the css/Experiment.css
that I have used:
* {
-fx-radius-default: 10px;
}
.track {
-fx-border-radius: -fx-radius-default;
-fx-border-color: black;
}
Unfortunately this doesn't work, giving an error message like this:
Could not resolve '-fx-radius-default' while resolving lookups for '-fx-border-radius' from rule '*.track' in stylesheet file: /home/abdullah/codebase/src/package/css/Experiment.css
If I use plain syntax (-fx-border-radius: 10px
), there is no problem with that.
What am I doing wrong here?
Edit: Conclusion
Conclusion: Not Possible
It seems what I am looking for is not possible with the current version of JavaFX, since "JavaFX CSS Reference Guide" only mentions "looked-up colors", and not a generic concept of "variables". It would be a good feature, though... Just saying...
I know it is a quite old question but I couldn't find any answer with a similar approach as mine. As the previous answer already says it is not possible with standard css except for colors. (Please correct me if I am wrong)
Nevertheless, it is possible if you are using less. I use less in one of my JavaFX projects and it works really well. You just have to configure your build process to compile your less files and generate the actual css files. I used maven in my project and below you can find my build configuration.
With this configuration I'm now able to use less and there is no problem to define custom variables. I use a color-catalogue.less file in my project which all other less files can import via the import attribute. Maybe this solution helps anyone.
Edit: If anyone is interested, a working example can be found here.
Just a little correction to your answers: It is possible also with numbers, not only colors.
for example:
works for me, and JavaFx taking the value '25' as '25px' (if I wrote '25px' it would fail). It's not exactly variables as with using less/sass but it can help people that don't need more than this.
Unfortunately it seems to work only for colors. But you need to ensure that your variable is "visible" from rule which uses it: