Clasa de stil JavaFX nu se va actualiza

Adăugez o clasă de stil unui nod dacă este selectat și apoi îl șterg dacă aleg un alt element. Chiar dacă am elimina clasa de stil, obiceiul de reîmprospătare nu va reveni la starea normală:

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

dar stilul va rămâne același cu clasa selectată

0
Au existat unele bug-uri în jurul managementului de clasă de stil în unele versiuni JavaFX. Reîncercați testul într-o previzualizare avansată a dezvoltatorilor și vedeți dacă aveți în continuare probleme.
adăugat autor jewelsea, sursa

5 răspunsuri

Cel puțin pentru Java 8, funcționează acum. Dar, în loc să fac ceea ce făcea OP, aș reuși la fel:

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

Se pare puțin mai curat.

Rețineți că selectorii CSS trebuie să arate astfel:

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

.clear {
    /* Styling attributes... */
}
0
adăugat

Acesta este un bug. Este raportat aici Eliminarea clasei de stil plutind, nu actualizează stilul . Poate doriți să votați și să urmăriți. Ca soluție, ar trebui să înlocuiți regulile CSS pe care le-ați atins/modificat pentru a fi aceleași ca cele standard. Demo:

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() {

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

și stil.css este:

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

când faceți clic pe butonul, style1 adăugat inițial este eliminat și style2 este adăugat.

0
adăugat
Nu este cea mai bună soluție pentru că trebuie să rescrii toate regulile pentru a le schimba, nu se vor reseta automat la implicit sau la altă clasă. Dar funcționează. Mulțumiri
adăugat autor alex.dominte, sursa
Nu trebuie să rescrieți. Deoarece selectorii de stil sunt aplicați unul după altul în ordinea în care apar. De exemplu, dacă am eliminat stilul1 și nu am adăugat stil2 pe butonul clic, atunci eticheta rămâne cu stilul implicit definit în caspian.css încorporat.
adăugat autor Uluk Biy, sursa
Uita de comentariul meu anterior. Acum înțeleg punctul de vedere.
adăugat autor Uluk Biy, sursa
@ user1236048 a actualizat răspunsul.
adăugat autor Uluk Biy, sursa

6 ani lates bug-ul este încă acolo, aici este un mod mai simplu de a merge, mai ales dacă nu veți dori să mizerie cu celelalte clase:

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

De ce funcționează aceasta? Deoarece lista utilizată pentru StyleClass, care este un TrackableObservablieList, moștenește de la o ierarhie unde eliminarea (indexul) face schimbări de foc în cazul în care eliminarea (obiect) nu.

0
adăugat

Încercați să adăugați un CSS pentru aplicație. Puteți utiliza chiar și FXML pentru a separa designul de logica aplicației. Iată o bucată de cod care a lucrat pentru mine în 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;
}
0
adăugat

Vă mulțumim pentru soluția postată de Uluk Biy. Dar nu pare să funcționeze așa cum este (testat pe jdk 1.70_40 win x 64). Trebuie să clar clase de stil înainte de clasa de setări. Aici codul de lucru pentru mine:

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() {
            @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);
    }
}
0
adăugat