首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java / Swing如何处理不同的屏幕DPI和密度设置?

Java / Swing如何处理不同的屏幕DPI和密度设置?
EN

Stack Overflow用户
提问于 2013-02-21 06:26:16
回答 4查看 3.8K关注 0票数 5

大家好,我最近遇到了一个问题,现在一些显示器有不同的DPI设置,一些显示器的密度更高,例如,苹果的Retina显示器。

用Java如何补偿不同显示器上不同的DPI设置和密度?是否可以在任何监视器上将控件缩放为相同大小。我知道当为Android编程时,所有的测量值都是"DP“,你可以为三种不同的显示密度指定不同的图像。

有没有办法可以使用Java / Swing为不同的显示密度选择不同的图像,这样我的应用程序在更高密度的显示器上就不会看起来模糊?或者这不是那么重要或者不可能吗?我知道Chrome目前没有考虑DPI,但Internet Explorer和其他应用程序考虑到了。

谢谢你的帮助,我是一个很长时间的Java开发人员,我以前从来没有想过DPI,我想知道我应该如何去做:)

EN

回答 4

Stack Overflow用户

发布于 2013-02-21 07:41:54

首先,相信平台的外观设计者会为文本和控件选择合理的默认大小。然后,避免挫败这些默认设置的诱惑。以下是一些启发式方法:

在考虑绝对定位时,考虑使用layout.

  • Respect

  • layouts;在考虑绝对定位时,请考虑使用自定义的layout.

  • Respect

  • layouts,在一系列平台上将图形缩放到封闭preferred size的大小,并根据需要使用仿真。
票数 4
EN

Stack Overflow用户

发布于 2015-03-04 01:54:56

首先,感谢垃圾神为你提供的有用链接,它们非常有帮助。

下面我列出了一些关于如何处理我遇到的有关DPI更改的问题的细节。

字体问题:

如果字体不适合组件,请查看下面的组件大小调整问题,因为组件的大小通常不适合组件内部的大小。另外,在JLabel中,您可以应用HTML标记来自动换行文本(还有其他解决方案,但这适用于我)。

如果组件的文本自然是默认的字体、大小和样式(Tahoma 11格式),那么一切都会自动为您完成。知道user574171在他对How to set the DPI of Java Swing apps on Windows/Linux?的回答中给出了不同的字体和布局管理器的图片,在他的http://kynosarges.org/GuiDpiScaling.html链接中显示了不同的问题和优点。这里的问题是关于" Swing“的问题,但他的链接在比较WPF、JavaFX和带有基本组件和不同字体的Swing布局时也很有用。你可以看到那里的"Swing a“字体是最好的,那就是Tahoma 11 Plain。然而,只有当组件自然是默认的字体、大小和样式(Tahoma 11 Plain)时,它才能起作用。这意味着加粗、加下划线、调整大小以及文本的不同字体将为不同的DPI自动调整大小。

如果文本是默认字体(Tahoma),但带有粗体、下划线或不同的大小,则该文本不会针对不同的DPI进行缩放。要解决不同DPI的缩放问题,请选中标记为“从默认字体派生字体”的复选框。" relative“选项将采用默认的DPI缩放字体,并应用您的相对更改,如更大或更小、粗体和下划线。还要知道,如果组件是JLabel,那么使用HTML标记可以自动缩放DPI,而不管您如何格式化文本(换行也是如此)。

如果组件本身不是默认的字体、样式和大小(Tahoma 11普通版),或者您想要不同的字体(即不是Tahoma),那么您需要将更改关联到另一个组件中,该组件自然是默认的,如JLabel。因此,如果125DPI将字体增加3,那么您需要的字体也会增加3。

组件大小调整问题:

所有组件都有首选大小、最小大小和最大大小属性,但我发现它们不能很好地处理DPI更改。“尊重组件的preferred size”项目符号在垃圾神的答案中告诉了你所有关于它的事情。总而言之,让组件的默认大小自行处理,因为它将尝试根据内部的大小调整大小。

如果组件可以使用默认大小,则可以为您完成DPI处理。正如垃圾之神所说:“首先,相信平台的外观设计师会为文本和控件选择合理的默认大小,然后,避免让这些默认大小受挫的诱惑。”同样,默认大小的组件通常根据内部大小调整大小(或可重新调整大小)。根据我自己的经验,当我设置可调整大小的组件时,我通过“水平可调整大小”或“垂直可调整大小”进行设置,因为我发现它与DPI更改以及窗口大小调整一样有效。

如果组件的默认大小不起作用,那么首先尝试查看下面我发现的一些具体问题。或者,尝试根据正确缩放的组件中的更改来缩放组件。即,将您期望的缩放组件的比率应用于100% DPI,并将更改应用于新的DPI。需要缩放到其他组件更改的组件的示例是它的文本由代码填充或它是一个图像。

作为最后的手段,使用JScrollPane允许用户滚动查看整个内容。如果窗口/对话框相当大,那么JScrollPane是一个很好的主意,因为如果对于用户的视力来说,DPI值较高,那么窗口通常比屏幕大。

注意:我发现在JPanel中封装组件组可以帮助swing更好地处理DPI更改。

JTextField大小问题:

设置columns属性,如果愿意,只设置文本。columns属性是要显示的字母或数字的数量。通常在允许用户输入数字时使用。要知道columns属性在多个平台上工作得很好。

JSpinner大小问题:

将模型设置为准确、有效和默认值。因此,组件的自动大小调整是针对最大值进行的,并且适用于DPI更改和其他平台。

表行高问题:

表行高不随DPI的增加而改变。我遇到了这个问题,这似乎是因为我试图与Java的旧版本兼容。将字体大小比例的变化或JLabel高度比的变化乘以DPI的变化。

票数 3
EN

Stack Overflow用户

发布于 2017-08-01 08:09:31

使用JRE 9(或更高版本)。

这是因为Java运行时(旧版本)声明自己是“DPI感知的”,但并不真正支持AWT和Swing。Java应用程序的大小和渲染基于像素,而不是适当缩放,这包括HiDPI显示。不管怎么说,这个问题最近已经解决了。请参阅问题JEP 263: HiDPI Graphics on Windows and Linuxupgrade

因此,增加字体大小不起作用(因为它不会增加其他内容);jvm参数-Dsun.java2d.dpiaware=false不起作用(因为它实际上并不受支持);清单文件+注册表编辑(对于Windows)也不起作用。

然后,您需要在JRE 9上运行它,因为它确实支持此功能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14991121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档