matlab 如何在Windows/Linux上设置Java Swing应用的DPI?

beq87vna  于 2022-11-15  发布在  Matlab
关注(0)|答案(7)|浏览(183)

如果你有一台DPI超过150的显示器(如Macbook Pro),你可能也会发现问题:Java Swing应用程序上的字体对于高DPI显示器来说太小了,我根本无法更改字体大小(它直接忽略Windows DPI,只显示*最原始的DPI-->96**)。我无能为力,只能改变屏幕分辨率,这绝对会让LCD上的一切变得模糊。
是的,我有一台笔记本电脑,有一个高DPI显示器,15.6英寸,1920x1080分辨率,一些Java桌面应用程序在我的笔记本电脑上看起来非常小,如MatLab,BurpSuite等。我已经在互联网上搜索了很长一段时间,但仍然找不到解决问题的方法。我知道我可以通过JRE_HOME/lib/font/fontconfig.properties.src更改JRE字体,但我找不到任何地方来设置Java桌面字体的默认字体大小或DPI。
这个问题没有解决办法吗?你们有高DPI的显示器吗?你是如何使用这类应用程序的?Swing会放弃高DPI用户吗?

6yoyoihd

6yoyoihd1#

我目前正在调查Windows上的这个问题。以下是我的发现:
大多数Swing外观和感觉根本不支持高DPI,甚至不支持Nimbus,尽管它应该是可伸缩的。我发现一些旧的博客文章说Nimbus最终可能会提供高DPI伸缩性,但显然这从未发生过。
一个例外是系统LAF,但在所有DPI设置下,其默认字体比实际系统字体小约10%。此外,必须按照此处所述明确选择系统:http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
在Swing中也没有可以设置的单一比例因子。特定的LAF必须提供代码来处理缩放。所以你能做的最好的选择就是选择系统,并希望它足够好。
然而,在我的系统上,JavaFX确实正确且自动地扩展到150%。如果可能的话,我建议您使用JavaFX来构建您的图形用户界面。
编辑:我制作了几个小测试程序,并拍摄了各种图形用户界面框架、Swing主题和DPI设置的比较屏幕截图。这可能会为阅读这个问题的人提供信息:http://kynosarges.org/GuiDpiScaling.html

lvjbypge

lvjbypge2#

简而言之:您需要在JRE9+上运行它。
长长的答案:
这是因为Java运行时声明自己是“DPI感知的”,但并不真正支持AWT和Swing。Java应用程序的大小和呈现基于像素,而不是正确缩放,这包括HiDPI显示。无论如何,这个问题最近已经得到了解决。请参见问题JEP 263: HiDPI Graphics on Windows and Linuxupgrade
因此,增加字体大小不起作用(因为它不会增加其他内容);JVM参数-Dsun.java2d.dpiaware=false不起作用(因为它实际上并不受支持);清单文件+注册表编辑(对于Windows)也不起作用。
解决方案:您需要在JRE9+上运行它,因为它确实支持此功能。

wf82jlnq

wf82jlnq3#

这款answer解决了我的4K屏幕Ubuntu笔记本电脑上的问题。
在应用程序的配置文件中,我添加了-Dsun.java2d.uiScale=2.5 Java参数,现在,在执行时,应用程序具有良好的伸缩性并且可以使用。

9nvpjoqh

9nvpjoqh4#

似乎在Linux(GTK)上,您可以通过在启动应用程序之前使用以下方法来缩放Apps DPI来解决这个问题。

export GDK_SCALE=2

(您也可以降低显示器分辨率,但这根本不是解决方案)。

dluptydi

dluptydi5#

在Linux上,根据我的实验,似乎不可能在任何Swing外观上进行伸缩。然而,使用涉及VNC vncdesk的黑客攻击是可能的。以下是我在vncDesk下运行gradle --gui的配置:

.vncdesk/1/settings.ini

[desktop]
width = 1050
height = 650

[window]
title = gradle
name = gradle in vncdesk
class = GradleInVncdesk
scale_factor = 2

.vncdesk/1/startup

#!/bin/sh
cd "$INVOCATION_DIR"
matchbox-window-manager&
exec gradle --gui "$@"
yftpprvb

yftpprvb6#

我按照以下说明设法解决了这个问题:Link
它是德语的,但我会翻译重要的东西。
创建此注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide]
"PreferExternalManifest"=dword:00000001

创建包含以下内容的清单文件:

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

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
    </requestedPrivileges>
  </security>
</trustInfo>

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    <ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</ms_windowsSettings:dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

</assembly>

将其复制到java.exe和javaw.exe所在的bin目录中,并将其命名为java.exe.manifestjavaw.exe.manifest(您将有两个内容相同但名称不同的文件)。
HTH。
伯恩德

50few1ms

50few1ms7#

正如*@demented hedgehog*所说,设置GDK_SCALE=2环境变量在Linux下确实有效。
如果您使用的是JetBrainsIntelliJ,则可以在Edit configurations > Build and Run > Enviroment variables下为您的项目设置环境变量
您可以在下面看到将GDK_SCALE=2放在哪里。

相关问题