css - 如何更改 JavaFX 可编辑组合框/日期选择器中文本字段的背景
问题描述
我有一个函数可以检查表单的输入(文本字段、组合框和日期选择器),如果它们中的任何一个为空,它会将背景颜色更改为浅红色
public void checkForm() {
if (clientIdInput.getText().equals("")) {
clientIdInput.setStyle("-fx-background-color: #F5D3D0");
}
if(clientNameInput.getText().equals("")) {
clientNameInput.setStyle("-fx-background-color: #F5D3D0");
}
if(clientPhoneNumberInput.getText().equals("")) {
clientPhoneNumberInput.setStyle("-fx-background-color: #F5D3D0");
}
if(trainerIdInput.getText().equals("")) {
trainerIdInput.setStyle("-fx-background-color: #F5D3D0");
}
if(trainerNameInput.getText().equals("")) {
trainerNameInput.setStyle("-fx-background-color: #F5D3D0");
}
if(membershipTypeOptions.getValue() == null) {
membershipTypeOptions.setStyle("-fx-background-color: #F5D3D0");
}
if(membershipStartDateInput.getValue() == null) {
membershipStartDateInput.setStyle("-fx-background-color: #F5D3D0");
}
if(membershipEndDateInput.getValue() == null) {
membershipEndDateInput.setStyle("-fx-background-color: #F5D3D0");
}
if(paymentMethodOptions.getValue() == null) {
paymentMethodOptions.setStyle("-fx-background-color: #F5D3D0");
}
if(paymentAmountInput.getText().equals("")) {
paymentAmountInput.setStyle("-fx-background-color: #F5D3D0");
}
}
除了日期选择器和可编辑组合框外,它工作正常,因为它们似乎有一个文本框分层在顶部,不受 -fx-background-color 属性的影响。所以我的问题基本上是如何使两个背景具有相同的颜色?作为一个小问题,有没有一种更有效的方法来实现这个函数的目的,而不是 10 个 if 语句?
这是函数运行后的样子:
解决方案
它适用于我-fx-background-color
用查找的颜色替换-fx-control-inner-background
,默认样式表使用它来为文本字段着色。
package org.jamesd.examples.validate;
import java.util.function.Predicate;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage stage) {
TextField tf1 = new TextField();
TextField tf2 = new TextField();
ComboBox<String> combo1 = makeCombo();
ComboBox<String> combo2 = makeCombo();
DatePicker dp1 = new DatePicker();
DatePicker dp2 = new DatePicker();
VBox root = new VBox(10, tf1, tf2, combo1, combo2, dp1, dp2);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10));
Button submit = new Button("Submit");
submit.setOnAction(e -> {
if (! (validate(tf -> tf.getText().isEmpty(), tf1, tf2)) &&
(! validate(cb -> cb.getValue() == null, combo1, combo2, dp1, dp2)) ) {
System.out.println("Success!");
}
});
root.getChildren().add(submit);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
private ComboBox<String> makeCombo() {
ComboBox<String> combo = new ComboBox<>();
combo.getItems().addAll("One", "Two", "Three");
combo.setEditable(true);
return combo ;
}
private <C extends Control> boolean validate(Predicate<C> invalidTest, C... controls) {
boolean result = true ;
for (C control : controls) {
if (invalidTest.test(control)) {
control.setStyle("-fx-control-inner-background: #F5D3D0;");
result = false ;
} else {
control.setStyle("");
}
}
return result ;
}
public static void main(String[] args) {
launch();
}
}
一种为您提供更多控制权的方法是在控件上设置自定义 CSS 伪类,然后使用外部样式表。
推荐阅读
- java - 从命令行构建 Gradle 失败并出现异常“无法初始化类 org.codehaus.groovy.runtime.InvokerHelper”
- botframework - 需要在 Composer 中捕获 HTTP 请求错误
- sql-server - 选择以显示值不为空的表中的所有不同行,并从表中选择一些额外的列
- javascript - 如何只给类单击元素,并在使用 Vue.js 单击其他元素时删除?
- c++ - 如果我想更改函数的返回类型,是否必须重写基类中的每个函数?
- vba - 从 csv 访问表导入仅获得一半的列
- spring-security - Spring webflux 安全 CSRF 令牌存储库
- git - 将分叉的 repo 与原始 repo 的测试分支合并
- .net - EF Core 中的自动计算字段
- reactjs - 过滤具有多个字符串值的对象