JavaFX TextArea中的模糊文本

时间:2014-05-19 01:23:27

标签: java javafx

我对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>

这是application类代码:

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

7 个答案:

答案 0 :(得分:13)

我已经找到了解决这个问题的方法。我能够确定问题集中在JavaFX 8中引入的错误,当ScrollPane具有十进制值约束时,导致ScrollPane内显示的内容有些模糊,该错误与内容的缓存图像有关关闭缓存工作。 TextAreas使用ScrollPanes。

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

答案 1 :(得分:4)

如果某人在来自ControlsFX的PopOver内有类似问题:文字控件(WebViewTextArea等内部的模糊文字)。

解决方案是覆盖-fx-stroke-width选择器中的.popover > .border属性:

.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

答案 2 :(得分:0)

我不能说为什么文字模糊,也许是因为使用的字体或应用的样式。但是你的图像中的差异来自于使用的不同版本的JavaFX。SceneBuilder使用JavaFX 2,而执行的则使用javaFX 8.配置Java环境以使用相同的版本。

确定使用的版本如:

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

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

答案 3 :(得分:0)

我注意到SceneBuilder 1.1使用

创建了一个css文件
.text {
    -fx-font-smoothing-type: lcd; 
} 

我没有玩过它,只有the Oracle says

  

LCD(液晶显示器)文本是一种消除锯齿的文本   LCD面板属性的优势在于使文本更流畅。您   可以使用API​​利用文本节点上的LCD文本   如实施例11中所示。

     

text.setFontSmoothingType(FontSmoothingType.LCD));

答案 4 :(得分:0)

我的模糊文字也有类似的问题。使用JavaFX Scene Builder,我注意到在Layout:Position下,我将Layout X / Y设置为非零值(如9.893739等)。当我用0代替那些时,模糊的文字就消失了。

答案 5 :(得分:0)

正如已经指出的那样,十进制值限制会导致文本模糊。因此,将滚动窗格的填充设置为 0 也足以使文本不模糊。

这个 css 将解决这个问题:

.text-area > .scroll-pane {
    -fx-padding: 0;
}

答案 6 :(得分:0)

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

我当前的缩放级别是 125%,甚至 treeView 和 ListViews 也很模糊, 所以至少我可以通过关闭“缓存”和“对齐像素”来修复它们。 它的作用就像魅力一样。