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

时间:2017-09-17 16:46:57

标签: javafx-2 color-picker

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

我已经尝试了一些选项,但似乎都没有,如下所示:

1。使用setEditable(boolean)

myColorPicker.setEditable(false);

这只是不起作用,颜色选择器仍然可以编辑。

2。同时使用setDisable(boolean)setOpacity(double)

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

这使得颜色选择器实际上不可编辑,并且生成的颜色选择器看起来比仅使用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.");
    }
});

上面的方法在我的控制台上打印了相应的消息,但是颜色选择器仍然响应鼠标点击(显示颜色表并允许选择新颜色)。还试图覆盖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 exerpt:

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

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

非常感谢!

1 个答案:

答案 0 :(得分:1)

我设法通过一些CSS实现它 。还需要setDisable(true)和opacity为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;
}