11

ノードが選択されている場合はスタイル クラスをノードに追加し、他のアイテムを選択している場合はそれを削除します。スタイル クラスを削除しても、スタイルは更新されないため、通常の状態には戻りません。

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

ただし、スタイルは選択したクラスと同じままです

4

5 に答える 5

16

これはバグです。ここで報告されていますホバーされたスタイルクラスの削除は、スタイリングを更新しません。投票して見るといいかもしれません。回避策として、触れた/変更した CSS ルールをオーバーライドして、デフォルトのものと同じにする必要があります。デモ:

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

style.css は次のとおりです。

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

ボタンをクリックすると、最初に追加されstyle1た が削除され、style2が追加されます。

于 2012-06-11T08:43:56.840 に答える
1

少なくとも Java 8 では、これが機能するようになりました。しかし、OPが行ったことを行う代わりに、次のように同じことを達成します:

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

少しきれいに見えます。

CSS セレクターは次のようにする必要があることに注意してください。

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

.clear {
    /* Styling attributes... */
}
于 2016-09-11T09:07:20.877 に答える
1

6年経ってもバグは残っています。特に他のクラスをいじりたくない場合は、より簡単な方法を次に示します。

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

なぜこれが機能するのですか?TrackableObservableList である StyleClass に使用されるリストは、remove(index) が実行する階層から継承するため、remove(Object) が実行しない変更が発生します。

于 2018-02-05T13:05:42.387 に答える
1

Uluk Biy が投稿したソリューションに感謝します。しかし、「そのまま」では動作しないようです (jdk 1.70_40 win x 64 でテスト済み)。設定クラスの前にスタイル クラスをクリアする必要があります。ここで私のための作業コード:

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);
    }
}
于 2013-10-06T09:26:04.293 に答える
0

代わりに、アプリケーションの css を追加してみてください。FXML を使用して、アプリケーションのロジックから設計を分離することもできます。これは、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;
}
于 2012-06-10T19:25:44.763 に答える