2012-06-04 13 views
9

Estoy agregando una clase de estilo a un nodo si se selecciona y luego la elimino si selecciono otro elemento. Incluso si quito la clase de estilo acostumbrado al estilo de actualización por lo que no pienso volver a su estado normal:La clase de estilo JavaFX no actualizará

admin_category_label.getStyleClass().remove(admin_category_label.getStyleClass().indexOf("selected")); 
admin_category_label.getStyleClass().add("clear"); 

pero el estilo seguirá siendo el mismo que clase seleccionada

+0

Hubo algunos errores en la gestión de la clase de estilo en algunas versiones de JavaFX. Vuelva a intentar la prueba en una [vista previa del último desarrollador] (http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html) y vea si todavía tiene problemas. – jewelsea

Respuesta

15

Esto es un error. Se informa aquí Removal of hovered style class, does not update styling. Es posible que desee votar y mirarlo. Como solución, debe anular las reglas CSS que tocó/modificó para que sean las mismas que las predeterminadas. Demostración:

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBoxBuilder; 
import javafx.stage.Stage; 

public class StyleDemo extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final Label lbl = new Label("Style Me"); 
     lbl.getStyleClass().add("style1"); // initial style 

     Button btn = new Button("Change the style"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent arg0) { 
       lbl.getStyleClass().remove("style1"); 
       lbl.getStyleClass().add("style2"); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(VBoxBuilder.create().spacing(20).children(lbl, btn).build()); 
     Scene scene = new Scene(root, 300, 250); 
     scene.getStylesheets().add(this.getClass().getResource("style.css").toExternalForm()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

y el style.css es: se añade

.style1 { 
    -fx-text-fill: red; 
    -fx-border-color: green; 
    -fx-font-size: 20; 
} 

.style2 { 
    -fx-text-fill: blue; 
    -fx-border-color: red; 
    -fx-font-size: 15; 
    -fx-underline: true; 
} 

cuando se hace clic en el inicialmente añadido es eliminado style1 el botón y el style2.

+0

No es la mejor solución porque tengo que volver a escribir todas las reglas para cambiarlas, no se restablecerán automáticamente a la predeterminada ni a otra clase. Pero funciona. Gracias –

+0

No, no tiene que volver a escribir. Porque los selectores de estilo se aplican uno tras otro en el orden en que aparecen. Por ejemplo, si eliminé el estilo1 y no agregué el estilo2 al hacer clic en el botón, la etiqueta permanecerá con su estilo predeterminado definido en caspian.css incorporado. –

+0

Olvide mi comentario anterior. Ahora entiendo el punto al que te refieres. –

0

Usted puede tratar de añadir un css para la aplicación en su lugar. Puede usar incluso FXML para separar el diseño de la lógica de su aplicación. Aquí hay un código que me funcionó en JavaFX 2.1.

private Parent replaceSceneContent(String fxml) throws Exception { 
    Parent page = (Parent) 
     FXMLLoader.load(
     Main.class.getResource(fxml), null, new JavaFXBuilderFactory()); 
    Scene scene = stage.getScene(); 
    if (scene == null) { 
     scene = new Scene(page, 1366, 720); 
     scene.getStylesheets().add(
     Main.class.getResource(
      "../skinFolder/css/defaultSkin.css").toExternalForm()); 
     stage.setScene(scene); 
    } else { 
     stage.getScene().setRoot(page); 
    } 
    stage.sizeToScene(); 
    return page; 
} 
1

Gracias por la solución publicada por Uluk Biy. Pero parece que no funciona "tal como está" (probado en jdk 1.70_40 win x 64). Tengo que borrar la clase de estilo antes de la clase de configuración. Aquí el código de trabajo para mí:

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBoxBuilder; 
import javafx.stage.Stage; 

public class StyleDemo extends Application { 
    //ADD just a toggle property 
    public static BooleanProperty toggle = new SimpleBooleanProperty(false); 

    @Override 
    public void start(Stage primaryStage) { 
     final Label lbl = new Label("Style Me"); 
     lbl.getStyleClass().add("style1"); // initial style 

     Button btn = new Button("Change the style"); 

     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       //ADD clear style class ! 
       lbl.getStyleClass().clear(); 
       if(toggle.get()) { 
        lbl.getStyleClass().add("style1"); 
        toggle.set(!toggle.get()); 
       }else{ 
        lbl.getStyleClass().add("style2"); 
        toggle.set(!toggle.get()); 
       } 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(VBoxBuilder.create().spacing(20).children(lbl,btn).build()); 
     Scene scene = new Scene(root, 300, 250); 
     scene.getStylesheets().add("/style.css"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
1

Al menos para Java 8, esto funciona ahora. Pero en lugar de hacer lo que hizo el PO, conseguiría lo mismo así:

admin_category_label.getStyleClass().remove("selected"); 
admin_category_label.getStyleClass().add("clear"); 

Parece un poco más limpio.

Recuerde, que sus selectores CSS deben tener este aspecto:

.selected { 
    /* Styling attributes... */ 
} 

.clear { 
    /* Styling attributes... */ 
} 
0

6 años los laters el error sigue ahí, aquí hay una manera más sencilla de ir, especialmente si usted no querrá meterse con las otras clases:

int indexOf = textField.getStyleClass().indexOf(INVALID_CLASS); 
if(indexOf != -1){ 
    textField.getStyleClass().remove(indexOf); 
} 

¿Por qué funciona esto? Debido a que la lista utilizada para StyleClass que es una TrackableObservablieList hereda de una jerarquía donde el remove (índice) dispara cambia donde el remove (Object) no lo hace.

Cuestiones relacionadas