当前位置: 首页 > 知识库问答 >
问题:

仅当用户开始键入时才清除JavaFX TextField中的提示文本

黄宏旷
2023-03-14

默认行为是字段中的提示文本在字段被聚焦时被擦除。这是当标记在字段中时。

是否可以配置文本字段,以便仅在用户开始键入时删除提示文本?

否则,我需要在每个文本字段旁边/上方添加一个标签,以描述其中的值。

共有3个答案

韩照
2023-03-14

您可以配置“-fx prompt text fill”键。文本字段:聚焦“类区域输入”。“文本字段”区域(css):

`.text-field {
    -fx-prompt-text-fill: derive(-fx-control-inner-background,-30%);
}
.text-field:focused {
    -fx-prompt-text-fill: derive(-fx-control-inner-background,-30%);
}`

并在fxml文件中添加“PrompText”条目:

<TextField fx:id="XY_Id" promptText="First name">

这就是全部,对我来说很有用。

顾俊哲
2023-03-14

我知道它有点旧,但我自己也需要它,这仍然非常相关
我将完成jewelsea的回答,并给出一个更简单的解决方案。

显然,这是Java(FX)的默认行为(只有当用户开始输入时,TextField中的提示文本才会被清除)。
但是,在JIRA系统中收到请求(或错误报告)后,
Java改变了这种行为(并默认在TextField获得焦点时清除文本)。

您可以在此处查看此错误报告。

要回到旧的默认值(和更好的行为IMO),您需要做的就是添加以下代码行。

如果您的应用程序接口是使用适当的Java代码编写的。

Java代码:

textField.setStyle("-fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);");

其中,文本字段是您的文本字段组件。

如果您的应用程序界面是使用FXML和CSS编写的,请将以下内容添加到CSS文件中。

JavaFX FXML(CSS):

.text-input, .text-input:focused {
    -fx-prompt-text-fill: derive(-fx-control-inner-background, -30%);
}

目前这是默认行为(文本字段获得焦点时,文本字段的提示文本被清除),因此无需html" target="_blank">执行任何操作即可获得此行为,
但如果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;
}

希望这有助于...

阮疏珂
2023-03-14

解决方案

此示例将允许JavaFX中的TextFields,其提示行为是在字段为空时显示提示,即使字段具有焦点。该解决方案是自定义CSS和自定义TextField类的组合,后者处理TextField的CSS样式。

persistent-prompt.css

.persistent-prompt:focused {
    -fx-prompt-text-fill: derive(-fx-control-inner-background,-30%);
}
.no-prompt {
    -fx-prompt-text-fill: transparent !important;
}

PersistentPrompTextField。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();
    }
}

提示转换器。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输入有一个占位符,其指定如下:

用户代理应该向用户提供此提示。当元素的值为空字符串或控件未聚焦(或两者都未聚焦)时。

您可以在此测试链接在浏览器中尝试此功能。

我认为,反对JavaFX这种行为的论点“当抓取焦点以表示已准备好接收用户输入时,应清除提示文本”是没有意义的,因为焦点文本字段有一个清晰可见的焦点环,因此用户知道即使在显示提示文本时,控件也已准备好接收输入。

在这方面,我认为JavaFX在默认情况下应该以与大多数HTML用户代理相同的方式进行操作。可以在JavaFX问题跟踪程序中创建一个调整请求,请求JavaFX中的输入提示与HTML实现类似(如果还没有为此创建问题的话)。

可供替代的

第三方Gluon Glisten具有自定义TextField控件,可以具有以下属性:

  • 浮动文本-文本字段中的占位符文本,当接收到焦点时,文本字段会转换到文本字段的顶部

基于Glistet的TextField的好处是提示文本始终可见,无论用户是否在控件中输入了任何内容。

 类似资料:
  • 简而言之:如何让UITextField框在用户第一次按键时移除所有内容?我不希望信息被删除,直到用户开始输入一些东西。即,在开始编辑时清除它是不够的。 长版本:我有三个UITextField循环(使用返回键并在“shouldReturn”方法中捕获按键。UITextField 中已有文本,如果用户未键入任何内容,而只是转到下一个 UITextField,则该值应保留(默认行为)。 但是我希望如果用

  • 问题内容: 用户停止键入时需要执行搜索。我知道我应该使用 setTimeout() 。但是使用 Reactjs我找不到它是如何工作的。 有人可以告诉我当用户停止键入几秒钟(假设为5)时如何调用方法(将处理Search)。我不知道该在哪里编写代码来检查用户是否停止键入。 我想在用户停止键入时调用sendToParent方法。 问题答案: 您可以按照以下方式使用您的代码, 另外,您需要在构造函数中绑定

  • 我的布局中有一个编辑文本,我尝试过在我的编辑文本中放置提示或文本。 当我第一次触摸或点击edittext时,移动键盘弹出输入文本,这是预期的,但edittext中的文本或提示不会被删除。我必须点击2次编辑文本,然后第一次移动键盘弹出,第二次点击删除文本。 我希望在第一次点击本身的文本应该从edittext删除。 例如:假设EditText将初始文本作为用户名,那么当用户第一次单击EditText时

  • 问题内容: 有没有一种快速的方法来创建带有右侧图标的输入文本元素,以清除输入元素本身(如google搜索框)? 我环顾四周,但只发现了如何将图标作为输入元素的背景。是否有jQuery插件或其他工具? 我想要输入文本元素中的图标,例如: 问题答案: 将a添加到您的输入中 该支持相当不错,但在IE <10中不起作用 旧浏览器的可清除输入 如果您需要IE9支持,请采取以下解决方法 使用标准和一些HTML

  • 问题内容: 我有一个字段,我想在其中应用的变体。 该字段与ajax调用绑定在一起,当用户更改输入时,服务器端将处理数据,但是,我不想太频繁地进行调用。 假设用户要输入一个真正的字符串,我希望仅在用户完成将要键入的单词后才能进行呼叫。不过,我不想使用诸如模糊之类的事件。有什么比实现更好的方法呢? 问题答案: 使用在角> 1.3 没有-在标记中: 在您的后备控制器/范围内 然后,您将仅在1000ms不

  • 我们的备份系统创建。bak文件,我们可以使用它来恢复文件,如果我们遇到问题。如果不处理,这些文件将填满我们的存储空间,因此我找到了一个批处理文件,每天创建新的批处理文件后,我都可以运行该文件来删除旧的批处理文件。 文件-p“c:\xxx\yyy”-s-m*。bak/D-2/C“cmd/C del@path” 这工作正常,但我想创建一个安全网,以便无论出于何种原因,我们的备份系统出现故障并且没有创建