为什么禁用的JavaFX TextArea具有与TextField不同的颜色

Emi*_*und 4 css java javafx

我正在重新设计JavaFX应用程序,但我的:disabled样式有问题.当我尝试更改-fx-text-fill和时-fx-opacity settings,textareas仍然会获得比文本字段略轻的文本颜色.这就是我现在的风格:

/*** Text Fields and Areas ***/
.text-field,
.text-area {
    -fx-text-fill: #000;
    -fx-opacity: 1.0;
}

.text-field:disabled,
.text-area:disabled {
    -fx-text-fill: #000;
    -fx-opacity: 0.5;
}
Run Code Online (Sandbox Code Playgroud)

这是禁用的组件在程序中的外观:来自JavaFX应用程序的 屏幕截图

正如你所看到的,文本颜色TextField就是#7a7a7a其为50% #000.该TextArea但是看起来有颜色#c7c7c7是25% #000.

有没有人知道如何为textareas和textfields获得相同的禁用颜色?

jew*_*sea 6

这是怎么回事

IMO目前的行为是一个错误,应该在http://bugreport.java.com上提交(我已经这样做了,遗憾的是Java bug报告系统没有提供任何方法来跟踪这个错误报告,除非它被JavaFX接受球队).

问题是文本区域中文本的不透明度修改器应用了两次.默认的TextArea外观实现为TextArea控件节点,其中包含内部ScrollPane,并且当禁用TextArea时,两者的不透明度设置为0.4,因此文本(以及滚动窗格中的滚动条)具有残疾不透明度褪色效果应用两次(这是错误的).您可以通过检查ScenicView中禁用的TextArea控件来查看此内容.

解决方法

当它包含在文本输入控件中时,将禁用的滚动窗格的不透明度显式设置为1.

.text-input > .scroll-pane:disabled {
    -fx-opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)

示例应用:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.scenicview.ScenicView;

public class DisabilityAssistance extends Application {

    @Override
    public void start(Stage stage) throws Exception{
        TextArea area = new TextArea("Text Area");
        area.setDisable(true);
        TextField field = new TextField("Text Field");
        field.setDisable(true);

        Scene scene = new Scene(new VBox(10, area, field));
        stage.setScene(scene);
        stage.show();

        scene.getStylesheets().add(getClass().getResource(
                "disability.css"
        ).toURI().toURL().toExternalForm());

        ScenicView.show(stage.getScene());
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出(未应用CSS解决方法):

破碎

输出(应用CSS解决方法):

固定