【问题标题】:Swing rendering appears broken in JDK 1.8, correct in JDK 1.7Swing 渲染在 JDK 1.8 中出现损坏,在 JDK 1.7 中正确
【发布时间】:2014-05-09 08:57:16
【问题描述】:

我已经安装了 IntelliJ IDEA (13.1.1 #IC-135.480) 和 JDK 1.8.0 (x64),并使用 GUI 表单设计器生成了一些 GUI。

然后我运行代码并意识到有些地方不对劲。

这是我的 GUI 的屏幕截图:

Font 的渲染似乎不太好。此外,当我将鼠标移到按钮上时,按钮会丢失其文本。

所以我安装了 JDK 1.7.0_40 (x64),重新编译了项目并再次运行。

当我使用 JDK 1.7 时,会出现以下表单:

渲染好像没问题,按钮也没问题。

所以我安装了最新的图形和芯片组驱动程序等等,但问题仍然存在。 您在使用 Java Swing UI 时遇到过这样的问题吗?你能帮我解决我的问题吗? 任何帮助将不胜感激。


更新:

我创建了一个只有 1 个 JTextArea 和 1 个 JButton 的小项目,但我遇到了同样的渲染问题。

根据 Andrew Thompson 的说法,我更改了 setSize() 并从 EDT 开始。下面的例子:

package at.maeh.java.client.simpleTextClient;

import javax.swing.*;
import java.awt.*;

public class SimpleClient extends JFrame {
    private JPanel panel1;
    private JTextArea textArea1 = new JTextArea();
    private JButton button1 = new JButton();

    public SimpleClient() {
        super("SimpleClient");

        // Panel
        panel1 = new JPanel();
        panel1.setLayout(new FlowLayout());

        // BUtton
        button1.setText("TestButton");

        // TextArea
        textArea1.setColumns(40);
        textArea1.setRows(15);

        // Add Components
        panel1.add(textArea1);
        panel1.add(button1);

        // Add to Frame
        this.getContentPane().add(panel1);

        // pack and set Visible
        pack();
        setVisible(true);

        System.out.println("Constructor EDT: " + SwingUtilities.isEventDispatchThread());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(SimpleClient::new);

        System.out.println("Main EDT: " + SwingUtilities.isEventDispatchThread());
    }
}

结果是一个包含组件的简单 JFrame。

当我写一些文本,或将鼠标指针移到按钮上时,组件会像这样呈现(文本:testsentence.123;按钮标签:TestButton)

【问题讨论】:

  • 您能否创建一个较小的示例并包含必要的代码,以便我们自己进行测试?
  • 嗨,我做了一个较小的项目,只有 1 个文本区域和 1 个按钮,我也遇到了同样的问题。我压缩了它 - 你可以从这里下载它:drive.google.com/file/d/0B4TRtWhseMOdSm1sVHd6eVhfR3M/…
  • 为了方便所有读者,最好将代码包含在问题本身中。
  • @duffy356:我认为SSCCE 是 Vulcan 的意思,而不是包含整个项目的 zip 文件。原因是任何人都可以复制我们的代码并快速测试它。
  • 渲染效果太差/太糟糕了,我真的不想责怪(官方)JDK 1.8 版本本身 - 有 许多 测试(和 beta 测试人员)对于这些天的 Java SDK/RE .. 在 IntelliJ 之外编译/使用 Java 8 SDK 时会发生什么?如果这有同样的问题,那么可以再删除一个变量,并且可以删除 IntelliJ-IDEA 标记(这实际上应该 not 重要)。或者,如果它 IDEA 设置的问题,那么可以更深入地探索。此外,在该系统上针对 JRE 8 运行 other Java Swing 程序时会发生什么?

标签: java swing rendering nvidia java-8


【解决方案1】:

对于那些问题还没有解决的人;试试这个解决方案:

在操作系统内部将全局环境变量“J2D_D3D”设置为“false”。 据 Sun 介绍,此设置用于在 Java 1.4.1_02 及更高版本中关闭 Java 2D 系统对 Direct3D 的使用。

即:只需创建一个名称为“J2D_D3D”且值为“false”且不带引号的环境变量。

这解决了我的渲染问题,希望它也能解决你的问题。

【讨论】:

  • 这确实解决了我的问题,但是哇……我们怎么能指望客户这样做呢?..
  • 是的!你是对的,我们不能指望任何客户这样做。目前有两种解决方案,1)使用 jdk 1.7 开发我们的应用程序/程序 2)在程序/应用程序的安装/运行时设置环境变量。如果我找到更好的方法,我会在这里发布更新。
  • 命令行选项-Dsun.java2d.d3d=false也应该可以工作。
  • 这对我也有帮助!我不做java编程,只是使用一些applet。而且我在java更新后也开始遇到这个讨厌的渲染错误。
  • 我的问题在于 Java 1.8 和 FreeMind 应用程序。我的第二台显示器由 Nvidia 卡运行,当我将 FreeMind 应用程序拖到第二个窗口时,窗口的内容变黑了。我将此环境变量添加为系统变量,重新启动,我的问题就解决了。在此处添加评论,以便人们可以通过 Google 找到此解决方案。
【解决方案2】:

终于找到了解决问题的方法。我不得不将 NVIDIA GeForce 620M 的能量控制设置更改为最高性能。

【讨论】:

  • 这不是解决方案,而是一种解决方法,因为您不想让应用程序的最终用户去做。
  • 我认为它很好找到。即使是标志 -Dsun.java2d.d3d=false 也不能解决 d3d 实现存在错误的实际问题(afaik 从版本 6 到 8)。
【解决方案3】:

您可以按照以下步骤操作:

  1. 右键单击桌面并单击 NVIDIA 控制面板
  2. 在左侧窗格中选择“管理 3D 设置”
  3. 在主窗口中选择“程序设置”选项卡
  4. 点击“添加”
  5. 导航到您的 java 文件夹 (C:\Program Files\Java\jre1.8.0_20\bin) 并选择 javaw.exe 并按“打开”(此步骤可能取决于您的操作系统,但应该很容易找到)
  6. 在显示“为此程序选择首选图形处理器”的位置单击下拉菜单并选择“高性能 NVIDIA 处理器”
  7. 点击右下角的“应用”即可。

【讨论】:

  • 与其他类似的答案一样 - 这绝对适合我。但是我们正在向客户提供客户端应用程序,并且无法控制他们的硬件 - 您希望如何在客户计算机上强制执行这些设置?
【解决方案4】:

我也有同样的问题。 duffys质量设置调整后的发现:

我的笔记本电脑同时运行 Intel HD 4000 和 NVS 5200M。在两张卡上运行带有 Java 7 的 Swing 应用程序都很好。使用 Intel 卡(无论质量设置如何)呈现的 Java 8 Swing GUI 看起来很崩溃(如 duffys 屏幕截图中所示),使用 NVS 5200M 时,它们看起来就像以前一样。

在 java 错误跟踪器上找不到任何东西,另一方面,很难描述这个错误。

【讨论】:

  • 我想知道这是否会在 Java 8 的较新版本中得到修复。我的戴尔笔记本电脑上有这个,它也有英特尔 HD 和 NVS。 :(
【解决方案5】:
textArea1.setSize(500, 300);

有问题。 Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置或尺寸。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them1,以及 white space2 的布局填充和边框。

【讨论】:

  • 嗨,我的问题不是间距。间距很好。我认为渲染问题与我的系统有关。因为它适用于其他用户(参见上面的 cmets)。
  • “因为它适用于其他用户(参见上面的 cmets)。” 是的,我已经看到他们了。这没有任何意义,事实上,这是明确设置大小的常见标志之一——在一台机器上运行良好,在其他机器上失败。邮政编码不设置大小,使用pack() 并在 EDT 上启动 GUI。否则,这个问答就是浪费时间。
  • 嗨,我更新了我的问题 - 现在我使用 pack() 并从 EDT 开始,但我遇到了同样的问题。
  • @HovercraftFullOfEels (耸耸肩)..去图。 ;)
  • 这个答案与 OP 的问题无关。
【解决方案6】:

带有 ubuntu mate 16.04 的 Dell Vostro 5480 我遇到了类似的问题。 修复了使用额外驱动程序更改 Nvidia 驱动程序的问题。

然后选择 NVidia 配置文件。

【讨论】:

    【解决方案7】:

    duffy356 的类似修复:

    Lenovo T430 运行 Windows 7 64 位,配备 NVIDIA NVS 5200M 和 HD 4000。 更新到 Java 8 更新 5 导致两个 Swing 应用程序 jEdit 和 Freemind 的图形和按钮损坏。

    使用 NVIDIA 控制面板小程序将电源管理模式的全局设置更改为“首选最高性能”似乎解决了这个问题。

    不确定应用设置大小的方式是否存在潜在问题。

    【讨论】:

      【解决方案8】:

      步骤:

      1. 控制面板
      2. 系统和安全
      3. 系统
      4. 远程设置
      5. 高级选项卡
      6. 点击环境变量
      7. 创建一个 J2D_D3D 变量
      8. 并将值设置为 false。

      为我工作,....

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 2014-07-03
        • 2014-07-07
        相关资源
        最近更新 更多