【问题标题】:Java FX TextField blurJavafx TextField 模糊
【发布时间】:2018-12-31 16:02:14
【问题描述】:

谁能告诉我为什么有时 JavaFX 会显示带有模糊效果的 TextField 的内容?它似乎是随机的,出现在我的任何TextFields 中。请看附图。

【问题讨论】:

  • 你说哪个模糊?我没有注意到任何模糊效果。另请附上您的代码。
  • 请说明您指的是图片中的哪个TextField
  • 也许模糊不是正确的词,但请查看第一个文本字段“Channels”与“Data Lines”文本字段符号“2”相比,符号“2”更粗。我将添加一些代码。
  • 当您编辑问题以包含重现效果的minimal reproducible example 时,请说明您关注的是2 字形。看起来它被渲染了两次,其中一个副本相对于另一个副本水平移动。

标签: javafx textfield blur


【解决方案1】:

专注于提到的间歇性渲染工件here2 字形看起来像是被渲染了两次,其中一个副本相对于另一个副本水平移动。众所周知,这种明显的随机异常很难识别。各种原因可能包括incorrect synchronizationimproper layout、宿主平台的rendering pipeline 中的缺陷等。作为参考,下面的示例可能允许您在不同平台上进行测试。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * @see https://stackoverflow.com/a/53989899/230513
 */
public class TextFieldTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("TextFieldTest");
        BorderPane root = new BorderPane();
        root.setCenter(createContent());
        root.setBottom(createVersion());
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Node createContent() {
        HBox row1 = new HBox(4);
        Label channelsLabel = new Label("Channels:");
        TextField channelsText = new TextField("2");
        channelsText.setPrefWidth(32);
        Label separatorLabel = new Label("Separator:");
        TextField separatorText = new TextField("!");
        separatorText.setPrefWidth(32);
        row1.setPadding(new Insets(8));
        row1.getChildren().addAll(
            channelsLabel, channelsText, separatorLabel, separatorText);
        HBox row2 = new HBox(4, new Label("Label:"), new TextField());
        row2.setPadding(new Insets(8));
        return new VBox(row1, row2);
    }

    private Label createVersion() {
        Label label = new Label(
            System.getProperty("os.name") + " v"
            + System.getProperty("os.version") + "; Java v"
            + System.getProperty("java.version"));
        label.setPadding(new Insets(8));
        return label;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Modena示例所示,故意模糊效果表示文本字段为focused

在您的image 中产生模糊效果的细节是复合边框,如下图 2x 所示:

在此处可以看到按钮(顶行)和默认按钮(底行)的类似效果:

【讨论】:

  • 嗨!感谢您对焦点的解释。我知道这一点,但我的问题是适用于文本字段内容的随机渲染错误。在我的图片中,这显示为符号 2 的粗体/模糊效果,出现在左上角的文本字段中。
  • 你好垃圾神!感谢更新。我目前正在测试对此行为的更正。以前,这些 texfields 被双向绑定到存储在其他地方的 String 属性。尽管在运行应用程序时,首先需要重置 String 属性,但这与清除 TextField 并不同步。我现在避免绑定,而是先调用一个线程来清除 TextField,然后显示相应 String 属性的值。它似乎有效,如果几天后得到确认,我将提供一个有效的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多