2012-10-25 11 views
13

Ho una semplice scena con questo codice:JavaFX 2 e CSS pseudo-classi: hover impostazione attributi di metodo setStyle

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

E il mio testcss.css è:

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

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

Quello che raggiungere è il bel effetto che è al passaggio del mouse quando si trovano nelle applicazioni web.

enter image description here ... enter image description here

DOMANDA
Come posso ottenere lo stesso effetto, ma senza un file CSS separato, solo attraverso il metodo setStyle della mia Button?
Il problema è che setStyle accetta solo la definizione di stile e lascia fuori il selettore.

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

Il selettore, nel mio caso hover è la pseudo-classe:

.button:hover 

ma dove dovrei impostarlo?

Inoltre, il javadoc è esplicito nella escludendo il selettore dal metodo setStyle argomento:

noti che, come l'attributo stile HTML, questa variabile contiene stile proprietà e valori e non la porzione selettore una regola di stile.

risposta

26

Come si nota nella sua interrogazione, come di JavaFX 2.2, i pseudoclasses CSS non sono esposti come parte del pubblico API è possibile utilizzare per la manipolazione di stile all'interno di codice Java.

Se si desidera modificare gli attributi di stile dal codice Java senza utilizzare un foglio di stile, è necessario impostare gli stili in base agli eventi o ai listeneristi. Ci sono un paio di opzioni nell'esempio qui sotto.

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); 
     } 
    }); 
    }  
} 

mi piacerebbe veramente solo farlo nel codice piuttosto che un foglio di stile, se i colori necessari per essere davvero dinamica facendo uso di fogli di stile con i colori predefiniti e stili problematico, o se ci fosse qualche altra avversione per utilizzare i fogli di stile CSS.

In JavaFX 8 è disponibile un'API pubblica che consente (se lo si desidera) a manipulate Region background colors without use of CSS.

uscita Esempio di programma (con il pulsante Aggiorna librato):

sample program output

+0

+1 per la completezza della risposta sia con l'innovativo (basata legame) e la soluzione tradizionale (evento in base). Interessante anche il fatto del gruppo in changeBackgroundOnHoverUsingEventi l'impostazione degli eventi e l'inizializzazione allo stile standard, in questo modo abbiamo un unico punto di configurazione per il widget, riducendo il rischio di modifiche incoerenti e evidenziando che la soluzione basata su eventi richiede il passaggio aggiuntivo di inizializzazione. Tale metodo può anche essere visto come inizializzatore, con qualche nome come "initButtonStyle". – AgostinoX

+0

Ciao Jewelea, hai detto che JavaFX 8 consente alcune modifiche. Possiamo avere un link o un esempio :).Perché la domanda è davvero vecchia e ha bisogno di un po 'di aggiornamento in questa parte. – GOXR3PLUS

+0

Risposta aggiornata al collegamento all'API di sfondo JavaFX 8. – jewelsea