Есть ли способ изменить стиль элементов по их атрибутам в javafx? - PullRequest
1 голос
/ 28 марта 2019

Я хочу отображать разные метки в javafx и стилизовать их в зависимости от их текста.Я добавил файл CSS и установил класс меток.Затем я проверил fxml и обнаружил, что текст сохраняется в текстовом атрибуте.

Я посмотрел на обычный css и обнаружил, что вы можете изменить стиль с помощью атрибутов.Вы должны использовать [] для этого.Я попробовал это в моем коде, и это не сработало.

Мой код: FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>

<HBox xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="controller">
    <stylesheets>
        <URL value="@../css/loadingScreen.css"/>
    </stylesheets>
    <Label styleClass="field" text="1" />
    <Label styleClass="field" text="2" />
    <Label styleClass="field" text="3" />
</HBox>

CSS:

.field {
    -fx-text-alignment: center;
    -fx-pref-height: 64px;
    -fx-min-width: 64px;
    -fx-pref-width: 64px;
    -fx-min-height: 64px;
    -fx-background-color: blue;
}

.field[text="1"]{
    -fx-background-color: red;
}

.field[text="2"]{
    -fx-background-color: yellow;
}

.field[text="3"]{
    -fx-background-color: green;
}

Я попробовал то же самое с обычными CSS и HTML, и это сработало там.HTML:

<!DOCTYPE html>
<html>
<head>
<style>
.field[text="1"]{
    background-color: red;
}

.field[text="2"]{
    background-color: yellow;
}

.field[text="3"]{
    background-color: green;
}
</style>
</head>
<body>

<div class="field" text="1" >1</div>
<div class="field" text="2" >2</div>
<div class="field" text="3" >3</div>

</body>
</html>

Что мне нужно сделать, чтобы эта работа работала в формате fxml?

1 Ответ

0 голосов
/ 28 марта 2019

Если бы я изменил текст, он также автоматически изменил бы стиль

Вы можете добиться этого с помощью пользовательской метки, которая меняет стиль при изменении текста.Я продемонстрирую это, изменив идентификатор ярлыка.В этом упрощенном примере текст используется в качестве идентификатора:

package tests;

import javafx.geometry.Pos;
import javafx.scene.control.Label;

public class CustomLabel extends Label{

    public CustomLabel() {
        setAlignment(Pos.CENTER);
        setPrefSize(50, 25);
    }

    void setTextAndId(String s){
        super.setText(s);
        /*To keep this demo simple and clear id is changed.
          If used, care must be taken to keep id unique. 
          Using setStyle() or PseudoClass should be preferred 
        */
        setId(s); 
    }
}

Пользовательскую метку можно использовать в формате fxml (Root.fxml):

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?>
<?import tests.CustomLabel?>

<StackPane xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="tests.Controller">
   <children>
      <CustomLabel fx:id="cLabel" text="&quot;&quot;" />
   </children>
</StackPane>

Простой CSS, изменяющий цвет фона на основепо id (Root.css):

#1{
    -fx-background-color: red;
}
#2{
    -fx-background-color: yellow;
}

#3{
    -fx-background-color: green;
}

Класс испытаний:

package tests;

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class TestCustomLabel extends Application {

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

        Parent root = FXMLLoader.load(getClass().getResource("Root.fxml"));
        root.getStylesheets().add(getClass().getResource("Root.css").toExternalForm());
        stage.setScene(new Scene(root));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

И контроллер испытаний:

package tests;

import javafx.animation.PauseTransition;
import javafx.fxml.FXML;
import javafx.util.Duration;

public class Controller {

    @FXML
    CustomLabel cLabel;
    private int counter = 1;

    @FXML
    private void initialize() {

        cLabel.setTextAndId(String.valueOf(counter++));

        PauseTransition pause = new PauseTransition(Duration.seconds(2));
        pause.setOnFinished(event ->{
            cLabel.setTextAndId(String.valueOf(counter++));
            if(counter > 3) {
                counter = 1;
            }
            pause.play();
        });
        pause.play();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...