Если бы я изменил текст, он также автоматически изменил бы стиль
Вы можете добиться этого с помощью пользовательской метки, которая меняет стиль при изменении текста.Я продемонстрирую это, изменив идентификатор ярлыка.В этом упрощенном примере текст используется в качестве идентификатора:
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="""" />
</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();
}
}