JavaFX TextArea 中的模糊文本

13

我在 JavaFX 中遇到了一个奇怪的问题。我在 SceneBuilder 中设计了一个简单的 Scene。预览中文本看起来没问题,但是在运行应用程序时,文本模糊不清。请看下面的图片。 example 以下是 FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<AnchorPane id="AnchorPane" fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="br.mviccari.javafxtest.controllers.TelaMensagemController">
  <children>
    <TitledPane alignment="CENTER_LEFT" animated="false" collapsible="false" contentDisplay="LEFT" prefHeight="400.0" prefWidth="600.0" text="Janela legal" textAlignment="LEFT" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
      <content>
        <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
          <children>
            <HBox id="HBox" alignment="CENTER" spacing="5.0" AnchorPane.bottomAnchor="14.0" AnchorPane.rightAnchor="14.0">
              <children>
                <Button mnemonicParsing="false" onAction="#acaoFodase" prefHeight="53.9609375" prefWidth="128.0" text="Foda-se" />
                <Button mnemonicParsing="false" onAction="#acaoOk" prefHeight="53.9609375" prefWidth="128.0" text="OK" />
              </children>
            </HBox>
            <TextArea fx:id="campoTexto" disable="false" editable="true" focusTraversable="true" prefHeight="278.0" prefWidth="570.0" rotate="0.0" text="Aqui vai um texto padrão motherfucker!" wrapText="true" AnchorPane.bottomAnchor="82.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="12.0" AnchorPane.topAnchor="14.0" />
          </children>
        </AnchorPane>
      </content>
    </TitledPane>
  </children>
</AnchorPane>

这里是应用程序类的代码:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/br/mviccari/javafxtest/layouts/telaMensagem.fxml"));
Parent root = fxmlLoader.load();
TelaMensagemController controller = fxmlLoader.getController();
controller.setParametroDeTeste("PIKACHU EU ESCOLHO VC!");
controller.init();
Stage stage = new Stage(StageStyle.DECORATED);
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(labelStatus.getScene().getWindow());
stage.setOpacity(1);
stage.setTitle("My New Stage Title");
stage.setScene(new Scene(root, 450, 450));
stage.showAndWait();

我已经尝试使用JDK 7运行应用程序,这样文本就不会模糊了,但是如何在JDK 8下运行并显示正常文本呢?

我已经将我的项目放在Bitbucket上,如果有人想查看代码或检出到您的机器上,您可以自己查看。

https://mateusviccari@bitbucket.org/mateusviccari/testejavafx.git


你使用的是HiDPI屏幕吗?你正在使用哪个版本的Java? - Appleshell
不好意思,我之前忘了提到这一点,但是我在问题中放置的两个图像样本是在同一台计算机上拍摄的。屏幕不是高分辨率屏幕,Java版本为1.8.0。 - Mateus Viccari
6个回答

16

我找到了解决这个问题的方法。 我能够确定该问题集中在JavaFX 8中引入的一个错误上,当ScrollPane具有小数值约束时,其中显示的内容会有些模糊,该错误与内容的缓存图像有关,因此关闭缓存可以解决该问题。 TextAreas使用ScrollPanes。

textArea.setCache(false);
ScrollPane sp = (ScrollPane)textArea.getChildrenUnmodifiable().get(0);
sp.setCache(false);
for (Node n : sp.getChildrenUnmodifiable()) {
    n.setCache(false);
}

4
太好了,谢谢!我尝试在控件初始化时运行它,但似乎此时ScrollPane尚未准备好。我不得不将其包装在Platform.runLater([...])中才能正常工作。 - gsnerf

4

如果有人在ControlsFX的PopOver中遇到模糊问题,例如WebViewTextArea等文本控件内的文本模糊不清。

解决方法是重写.popover > .border选择器内的-fx-stroke-width属性:

.popover > .border { -fx-stroke-width: 1; }

示例:

val popOver = PopOver()
val webView = WebView()
webView.engine.loadContent("<html>Some text that should be not blurred</html>")
popOver.contentNode = webView
popOver.root.stylesheets.add(this.javaClass.getResource("test.css").toString())


var b = Button("Press")
val scene = Scene(StackPane(b), 800.0, 600.0)

b.onAction = EventHandler { popOver.show(b) }

primaryStage.scene = scene
primaryStage.show()

enter image description here


非常感谢,这解决了我个人项目中模糊文本的问题 :) - Josua Frank

1
正如所指出的,十进制值约束会导致模糊文本。因此,将滚动窗格的填充设置为0也足以使文本非模糊。
这个css将解决这个问题:
.text-area > .scroll-pane {
    -fx-padding: 0;
}

我的Javafx WebView遇到了文本和元素模糊的问题,例如按钮等。事实证明解决办法是找到最近的父级面板,并将其样式设置为"-fx-padding: 0",可以通过SceneBuilder(在检查器中,例如AnchorPane转到属性/样式-并添加样式条目)或者通过代码实现,例如anchorPaneWebview1.setStyle("-fx-padding: 0”) - abulka

0

我无法确定文本为什么模糊,可能是因为使用的字体或应用的样式不同。但是您图像中的差异来自于使用的不同版本的JavaFX。SceneBuilder使用JavaFX 2,而执行的版本使用JavaFX 8。请配置您的Java环境以使用相同的版本。

确定所使用的版本如下:

primaryStage.setTitle(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());

在我的Windows 8机器上,文本区域中的文本显示如下,没有模糊。请注意标题中的版本号: enter image description here


展示的版本为8.0.0-b132,与你的版本相同。我已经在我的工作中使用Windows 7机器尝试了它,也使用与我家里PC相同的运行时版本(家用PC使用运行8)。 - Mateus Viccari
我已经尝试切换到JDK 7,这样文本就不会模糊显示了...但是如何在JDK 8中以这种方式显示呢? - Mateus Viccari
@MateusViccari。你应用了任何样式吗?模糊效果只在文本区域中显示还是其他控件(文本字段、标签等)也有? - Uluk Biy
没有应用样式,模糊效果只会在TextArea中发生。 - Mateus Viccari

0
我遇到了与模糊文本类似的问题。使用JavaFX Scene Builder,我发现在布局:位置下,我有“布局X / Y”非零值(例如9.893739等)。当我将它们替换为0时,模糊的文本消失了。

0

相关的错误 JDK-8211294 在 OpenJfx16 发布中已经修复,尽管我在 Dpi 缩放级别 > 100% 的文本区域中仍然看到相同的问题。

我的当前缩放级别为125%,即使树视图和列表视图也模糊不清, 所以至少我可以通过关闭“Cache”和“Snap To Pixel”来修复它们。 而且它运转得非常好。


如何关闭“缓存”和“像素对齐”? - Damn Vegetables
在FXML文件中,添加以下属性(您可以使用SceneBuilder UI轻松完成此操作):scaleShape="false" cacheShape="false"snapToPixel="false"对于ScrollPane,在某些地方,我还必须使用以下内容以获得更好的结果 -scrollPane.lookup(".viewport").setCache(false);我将其保存为方法,并在所有ScrollPane上调用它,这样可以消除所有模糊。 - Arun Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接