2012-10-25 10 views
13

でホバー属性を設定する私はこのコードで簡単なシーンがあります。のJavaFX 2とCSSの擬似クラス:でsetStyleメソッド

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

をそして、私のtestcss.cssは次のとおりです。

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

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

私が達成何Webアプリケーションでは、ホバーと呼ばれる素晴らしい効果です。

enter image description here ... enter image description here

QUESTION
は、どのように私はちょうど私のボタンのでsetStyleメソッドを介して、しかし、別のCSSファイルを使用せずに同じ効果を達成することができますか?
問題は、setStyleはスタイル定義だけを受け入れ、セレクタを省略することです。私のホバー場合

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

セレクタは、擬似クラスです:

.button:hover 

が、私はそれを設定することが出来るのですか?

注HTMLスタイル属性のように、この変数は、スタイル プロパティと値とのない選択部分を含む、:

また、JavadocはのsetStyleメソッド引数からセレクタを除いで明示的スタイルルール

答えて

26

JavaFX 2.2では、Javaコード内のスタイル操作に使用できるパブリックAPIの一部としてCSS疑似クラスが公開されていません。

スタイルシートを使用せずに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には、あなたが(もし望むなら)manipulate Region background colors without use of CSSを許すパブリックAPIがあります。

サンプルプログラム出力(Updateボタンを推移して):

sample program output

+0

1革新的な(基づく結合)と従来の(イベントベース)ソリューションの両方と答えの完全性のために。 changeBackgroundOnHoverUsingEventsへのグループの事実にも興味があり、イベント設定と標準スタイルへの初期化の両方を行うことができます。この方法で、ウィジェットの単一の設定ポイントが得られ、インコヒーレントな変更のリスクが軽減され、イベントベースのソリューションが強調されます初期化。そのようなメソッドは、「initButtonStyle」のような名前を持つ初期化子として見ることもできます。 – AgostinoX

+0

こんにちはJewelea、あなたはJavaFX 8がいくつかの変更を可能にすると述べました。リンクや例がありますか?:)問題は本当に古く、この部分で少し更新が必要なためです。 – GOXR3PLUS

+0

JavaFX 8バックグラウンドAPIへのリンクへの回答が更新されました。 – jewelsea

関連する問題