Подтвердить что ты не робот

Javafx 2 и css псевдоклассы: установка атрибутов наведения в методе setStyle

У меня есть простая сцена с этим кодом:

scene.getStylesheets().add("packagename/testcss.css");

И мой testcss.css:

.button { 
    -fx-background-color: #DDFFA4;
}

.button:hover {
    -fx-background-color: #9ACD32;
}

То, что я достигаю, - это приятный эффект, который является aka hover, когда в веб-приложениях.

enter image description here... enter image description here

Вопрос
Как я могу достичь такого же эффекта, но без отдельного файла css, просто с помощью метода setStyle моей Button?
Проблема в том, что setStyle принимает только определение стиля и не включает селектор.

button.setStyle("-fx-background-color: #DDFFA4;");

Селектор, в моем случае наведения - псевдокласс:

.button:hover

но где я должен его установить?

Кроме того, javadoc является явным в исключении селектора из аргумента метода setStyle:

Обратите внимание, что, подобно атрибуту стиля HTML, эта переменная содержит стиль свойства и значения, а не селекторную часть правила стиля.

4b9b3361

Ответ 1

Как вы заметили в своем вопросе, с JavaFX 2.2, псевдоклассы css не отображаются как часть общедоступного API, который вы можете использовать для манипулирования стилями внутри кода Java.

Если вы хотите изменить атрибуты стиля из кода Java без использования таблицы стилей, вам необходимо установить стили на основе событий или списков изменений. В приведенном ниже примере имеется несколько вариантов.

import javafx.application.Application;
import javafx.beans.binding.*;
import javafx.beans.property.SimpleStringProperty;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.stage.Stage;

/** Changing button styles on hover without a css stylesheet. */
public class ButtonBackgroundChanger extends Application {
  private static final String STANDARD_BUTTON_STYLE = "-fx-background-color: #DDFFA4;";
  private static final String HOVERED_BUTTON_STYLE  = "-fx-background-color: #9ACD32;";

  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    Button configure = new Button("Configure");
    changeBackgroundOnHoverUsingBinding(configure);
    Button update = new Button("Update");
    changeBackgroundOnHoverUsingEvents(update);

    VBox layout = new VBox(10);
    layout.setAlignment(Pos.CENTER);
    layout.setStyle("-fx-padding: 10;");
    layout.getChildren().addAll(configure, update);
    stage.setScene(new Scene(layout));
    stage.show();
  }

  private void changeBackgroundOnHoverUsingBinding(Node node) {
    node.styleProperty().bind(
      Bindings
        .when(node.hoverProperty())
          .then(
            new SimpleStringProperty(HOVERED_BUTTON_STYLE)
          )
          .otherwise(
            new SimpleStringProperty(STANDARD_BUTTON_STYLE)
          )
    );
  }

  public void changeBackgroundOnHoverUsingEvents(final Node node) {
    node.setStyle(STANDARD_BUTTON_STYLE);
    node.setOnMouseEntered(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent mouseEvent) {
        node.setStyle(HOVERED_BUTTON_STYLE);
      }
    });
    node.setOnMouseExited(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent mouseEvent) {
        node.setStyle(STANDARD_BUTTON_STYLE);
      }
    });
  }    
}

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

В JavaFX 8 существует публичный API, который позволяет (если вы хотите) манипулировать цветами фона в регионе без использования CSS.

Пример вывода программы (с кнопкой "Обновить" ):

sample program output