我想通过改变其样式类来改变节点的风格.
Button button = new Button(); button.getStyleClass().add("class1") button.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { button.getStyleClass().add("class2"); } });
是否有可能逐渐改变风格,进行转型?
解决方法
Is it possible to change style gradually,for example make some transition?
是.
您将需要使用setStyle而不是样式类,因为类将是在css中定义的静态事件.在JavaFX css中没有直接的支持动画.您需要在Java代码中执行动画步骤来修改css样式.
当您想使用css执行转换时,我只会真正推荐此方法,因为没有相应的Java API可以轻松获得.
要处理动画,您可以使用标准的javafx动画Timeline来处理CSS样式属性所依赖的属性.
例如,将您的样式属性绑定到字符串.然后在时间轴中更改要更改的组件(在本例中为colorStringProperty).
warningButton.styleProperty().bind( new SimpleStringProperty("-fx-base: ") .concat(colorStringProperty) .concat(";") .concat("-fx-font-size: 20px;") );
这是一个示例,它使用css闪烁一个按钮,当按下时,它的基本颜色从灰色逐渐变为红色.
import javafx.animation.*; import javafx.application.Application; import javafx.beans.property.*; import javafx.beans.value.*; import javafx.event.*; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.image.*; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.util.Duration; /** Shows how you can modify css styles dynamically using a timeline. */ public class Warning extends Application { private static final String BACKGROUND = "http://bobgreiner.tripod.com/1cc2ce10.jpg"; @Override public void start(Stage stage) throws Exception{ final ObjectProperty<Color> warningColor = new SimpleObjectProperty<>(Color.GRAY); final StringProperty colorStringProperty = createWarningColorStringProperty(warningColor); StackPane layout = new StackPane(); layout.getChildren().addAll( new ImageView(new Image(BACKGROUND)),createWarningButton( warningColor,colorStringProperty ) ); stage.setScene(new Scene(layout)); stage.show(); } private StringProperty createWarningColorStringProperty(final ObjectProperty<Color> warningColor) { final StringProperty colorStringProperty = new SimpleStringProperty(); setColorStringFromColor(colorStringProperty,warningColor); warningColor.addListener(new ChangeListener<Color>() { @Override public void changed(ObservableValue<? extends Color> observableValue,Color oldColor,Color newColor) { setColorStringFromColor(colorStringProperty,warningColor); } }); return colorStringProperty; } private Button createWarningButton(final ObjectProperty<Color> warningColor,StringProperty colorStringProperty) { final Button warningButton = new Button("Warning! Warning!"); warningButton.styleProperty().bind( new SimpleStringProperty("-fx-base: ") .concat(colorStringProperty) .concat(";") .concat("-fx-font-size: 20px;") ); warningButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { Timeline flash = new Timeline( new KeyFrame(Duration.seconds(0),new KeyValue(warningColor,Color.GRAY,Interpolator.LINEAR)),new KeyFrame(Duration.seconds(0.25),new KeyFrame(Duration.seconds(1),Color.RED,new KeyFrame(Duration.seconds(1.25),Interpolator.LINEAR)) ); flash.setCycleCount(6); flash.setAutoReverse(true); flash.play(); } }); return warningButton; } private void setColorStringFromColor(StringProperty colorStringProperty,ObjectProperty<Color> color) { colorStringProperty.set( "rgba(" + ((int) (color.get().getRed() * 255)) + "," + ((int) (color.get().getGreen() * 255)) + "," + ((int) (color.get().getBlue() * 255)) + "," + color.get().getOpacity() + ")" ); } public static void main(String[] args) { launch(args); } }