Why are style classes stored in a List instead of a Set?

Tom Schindl tom.schindl at bestsolution.at
Thu May 21 06:04:55 UTC 2015


Beside the usecase mentioned by Tomas - the following thread on stackoverflow indicate that it might in some cases make a difference!

http://stackoverflow.com/questions/15670631/does-the-order-of-classes-listed-on-an-item-affect-the-css

Tom

Von meinem iPhone gesendet

> Am 21.05.2015 um 07:39 schrieb Tomas Mikula <tomas.mikula at gmail.com>:
> 
> Hi Roland,
> 
> I don't know why it is a List (maybe it is just copying it being a
> list in the DOM), but it makes sense to me that a style class can be
> present multiple times (for that matter, a multi-set would work just
> as well):
> 
> If I have two places in my code that add and remove the same style
> class, it makes sense to me the style class being removed after both
> of them have removed it, not just the first one. Say that I have two
> different conditions, either of which makes a node "highlighted". When
> both are true, and then one of them stops being true, I still want the
> node to stay highlighted.
> 
> Why do you need to make a contains-check?
> 
> Tomas
> 
>> On Thu, May 21, 2015 at 1:17 AM, Roland C <roland.cidar at gmail.com> wrote:
>> I was recently toying around with CSS in JavaFX and noticed that I got the
>> same style multiple times in the style list of my node.
>> 
>> Since the order of the styles is defined by the order in the css file and
>> not by the order of the list that getStyleClass() of a node returns, I was
>> wondering if there is a special reason for that.
>> 
>> Example:
>> 
>> application.css
>> 
>> .bg-color-1 {
>>    -fx-background-color:red; }.bg-color-2 {
>>    -fx-background-color:green;}
>> 
>> Main.java
>> 
>> public class Main extends Application {
>>    @Override
>>    public void start(Stage primaryStage) {
>>        try {
>>            BorderPane root = new BorderPane();
>> 
>>            root.getStyleClass().add( "bg-color-1");
>>            root.getStyleClass().add( "bg-color-2");
>> 
>>            Scene scene = new Scene(root,400,400);
>>            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
>>            primaryStage.setScene(scene);
>>            primaryStage.show();
>>        } catch(Exception e) {
>>            e.printStackTrace();
>>        }
>>    }
>> 
>>    public static void main(String[] args) {
>>        launch(args);
>>    }}
>> 
>> It doesn't matter if you write
>> 
>>    root.getStyleClass().add( "bg-color-1");
>>    root.getStyleClass().add( "bg-color-2");
>> 
>> or change the order to
>> 
>>    root.getStyleClass().add( "bg-color-2");
>>    root.getStyleClass().add( "bg-color-1");
>> 
>> The used style will always be the last in the css file, i. e. "bg-color-2".
>> 
>> *Question*
>> 
>> Why is a List used instead of a Set? A list is less performing than a Set
>> and it clutters the code if you always have to make a contains-check first.
>> 
>> 
>> Thank you very much!


More information about the openjfx-dev mailing list