默认行为是,当字段正在聚焦时,字段中的提示文本将被删除。那是标记在场中的时候。
是否可以配置文本字段,以便在用户开始输入时仅删除提示文本?
否则我需要在每个文本字段旁边/上方添加一个标签,以便对其中的值进行描述。
答案 0 :(得分:13)
<强>解决方案强>
此示例将允许JavaFX中的TextFields,其提示行为是在字段为空时显示提示,即使该字段具有焦点。该解决方案是自定义CSS和自定义TextField类的组合,后者操纵TextField的CSS样式。
持久prompt.css
.persistent-prompt:focused {
-fx-prompt-text-fill: derive(-fx-control-inner-background,-30%);
}
.no-prompt {
-fx-prompt-text-fill: transparent !important;
}
PersistentPromptTextField.java
import javafx.scene.control.TextField;
public class PersistentPromptTextField extends TextField {
PersistentPromptTextField(String text, String prompt) {
super(text);
setPromptText(prompt);
getStyleClass().add("persistent-prompt");
refreshPromptVisibility();
textProperty().addListener(observable -> refreshPromptVisibility());
}
private void refreshPromptVisibility() {
final String text = getText();
if (isEmptyString(text)) {
getStyleClass().remove("no-prompt");
} else {
if (!getStyleClass().contains("no-prompt")) {
getStyleClass().add("no-prompt");
}
}
}
private boolean isEmptyString(String text) {
return text == null || text.isEmpty();
}
}
PromptChanger.java
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class PromptChanger extends Application {
@Override
public void start(Stage stage) throws Exception {
TextField textField1 = new PersistentPromptTextField("", "First name");
TextField textField2 = new PersistentPromptTextField("", "Last name");
VBox layout = new VBox(
10,
textField1,
textField2
);
layout.setPadding(new Insets(10));
Scene scene = new Scene(layout);
scene.getStylesheets().add(
getClass().getResource(
"persistent-prompt.css"
).toExternalForm()
);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
目前如何在JavaFX 8中实现快速处理
用于控制提示文本的JavaFX 8(modena.css)的默认CSS如下:
.text-input {
-fx-prompt-text-fill: derive(-fx-control-inner-background,-30%);
}
.text-input:focused {
-fx-prompt-text-fill: transparent;
}
只要字段被聚焦,这将使提示文本透明,即使该字段中没有数据。
与HTML比较
HTML输入有一个placeholder,其指定如下:
用户代理应向用户提供此提示。 。 。当元素的值为空字符串或控件未聚焦(或两者都有)时。
您可以在此test link上的浏览器中尝试此功能。
我认为针对JavaFX的这种行为的反对“当抓取焦点以便接收用户输入的信号准备时,应该清除提示文本”是没有意义的,因为聚焦的文本字段获得清晰可见的聚焦环,因此用户知道控件即使显示提示文本,也准备接收输入。
我认为JavaFX默认情况下应该与大多数HTML用户代理在这方面的操作方式相同。您可以在JavaFX issue tracker中创建一个Tweak请求,以请求JavaFX中的输入提示与HTML实现类似(如果没有为此创建问题)。
<强>替代强>
第三方Gluon Glisten has a custom TextField control可以具有以下属性:
基于Glisten的TextField的好处是提示文本始终可见,无论用户是否在控件中输入了任何内容。
答案 1 :(得分:7)
我知道它有点旧,但我自己需要它,这仍然非常重要。
我将完成jewelsea
的答案并提供更简单的解决方案。
显然这是Java(FX)的默认行为(仅当用户开始输入时,TextField中的提示文本才被清除)。
但随后,在JIRA系统中发出请求(或错误报告)后,
Java改变了这种行为(并且默认情况下在TextField获得焦点时清除文本)。
您可以查看此错误报告here。
要回到旧的默认(以及更好的IMO行为),您只需要添加以下代码行。
如果使用适当的Java代码编写应用程序接口。
Java代码:
textField.setStyle("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);");
textField
是TextField组件。
如果您的应用程序界面是使用FXML和CSS编写的,请将以下内容添加到CSS文件中。
JavaFX FXML(CSS):
.text-input, .text-input:focused {
-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);
}
目前它是默认行为(当文本字段获得焦点时,文本字段的提示文本被清除),
所以你不需要做任何事情来实现这种行为,
但是如果Java决定回到清除键入的行为,
并且您希望获得清除焦点行为,这是如何:
在适当的Java代码的情况下 - 它有点棘手,因为你不能直接定义伪类的行为。
Java代码(使用绑定):
textField.styleProperty().bind(
Bindings
.when(textField.focusedProperty())
.then("-fx-prompt-text-fill: transparent;")
.otherwise("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);"));
或 -
Java代码(使用事件):
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (newValue) {
textField.setStyle("-fx-prompt-text-fill: transparent;");
} else {
textField.setStyle("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);");
}
}
});
JavaFX FXML CSS:
将以下内容添加到CSS文件中。
.text-input {
-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);
}
.text-input:focused {
-fx-prompt-text-fill: transparent;
}
希望这有助于......
答案 2 :(得分:0)
假设您通过以下方式设置提示文字:
@FXML TextField tf;
public void someMethod() {
tf.setPromptText("This is the prompt text");
}
您可以改为使用tf.setText(String str)
来设置初始文字。
然后,在控制器的initialize方法中,添加:
tf.setOnKeyTyped(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
tf.setText(null);
}
});
您可以参考的链接以获取更多帮助:Click me!
答案 3 :(得分:0)
我确信可能有多种方法和技巧可以实现您的要求,但是,当您这样做时,您将覆盖默认的,预期的和标准的UI行为。当抓取焦点以表示准备好接收用户输入时,应该清除提示文本,而不是在用户开始输入后。