如何在没有模拟外观的情况下禁用 JavaFX ColorPicker?

How to make JavaFX ColorPicker disabled without dim appearence?

我一直在尝试禁用 javafx.scene.control.ColorPicker 而不是在 UI 中调暗它。这意味着我希望它看起来已启用(启用外观),但只是不响应任何命令,也没有在鼠标单击时显示 table 颜色(实际上已禁用)。根据系统状态,此行为可与正常行为互换(即,有时颜色选择器会正常行为)。

我尝试了一些选项,但 none 似乎有效,如下所示:

1.使用 setEditable(boolean):

myColorPicker.setEditable(false);

这是行不通的,颜色选择器仍然是 editable。

2。 setDisable(boolean)setOpacity(double) 一起使用:

myColorPicker.setDisable(true);
myColorPicker.setOpacity(1.0f);

这使得颜色选择器实际上不是 editable,并且生成的颜色选择器看起来比仅使用 setDisable(true) 暗淡一点,但仍然不是启用颜色选择器的外观。

3。用空实现覆盖 onMouseClick()onMousePressed()onMouseReleased()

myColorPicker.setOnMouseClicked(new EventHandler <MouseEvent>() {
    public void handle(MouseEvent event) {
        System.out.println("Mouse clicked.");
    }
});

myColorPicker.setOnMousePressed(new EventHandler <MouseEvent>() {
    public void handle(MouseEvent event) {
        System.out.println("Mouse pressed.");
    }
});

myColorPicker.setOnMouseReleased(new EventHandler <MouseEvent>() {
    public void handle(MouseEvent event) {
        System.out.println("Mouse released.");
    }
});

上述方法在我的控制台上打印了相应的消息,但颜色选择器仍然响应鼠标单击(显示颜色 table 并允许选择新颜色)。还尝试覆盖 setOnAction(EventHandler<ActionEvent>),但效果相同(除了当我单击颜色选择器时没有控制台打印)。

这是我的 FXML 的摘录:

<VBox fx:controller="mypackage.ElementConfigWidget"
    xmlns:fx="http://javafx.com/fxml" fx:id="root" styleClass="elementConfigPane">
    <HBox id="elementInfo">
        (...)
        <ColorPicker fx:id="elementColor" styleClass="elementColor" />
    </HBox>
(...)
</VBox>

这是我的 CSS 摘录:

.elementColor {
    -fx-cursor: hand;
    -fx-background-color: #fff;
    -fx-focus-color: transparent;
    -fx-faint-focus-color: transparent;
    -fx-pref-width: 50.0;
}

我实际上希望 setEditable(boolean) 通过保持元素出现并忽略输入操作来解决我的问题。我错过了什么?

非常感谢!

我设法用一些 CSS 实现了它 .此外,您还需要将 setDisable(true) 和不透明度设置为 1.0

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ColorPicker;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {

        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        ColorPicker myColorPicker = new ColorPicker();

        myColorPicker.setDisable(true);
        myColorPicker.setOpacity(1.0);

        Scene s = new Scene(myColorPicker);
        s.getStylesheets().add(this.getClass().getResource("test.css").toExternalForm());

        primaryStage.setScene(s);
        primaryStage.show();
    }

}

还有 test.css

.color-picker > .label:disabled {
    -fx-opacity : 1.0;
}