java - 如何根据 Windows DPI 计算 SWT 小部件大小

标签 java layout swt dpi

我面临的问题是,当我将个性化 -> 显示 -> 自定义 dpi 中的 DPI 值更改为大于或等于 110% 的值时,我的标签不再完全可见。我正在通过 .setLayoutData() 设置标签的高度和宽度。当 dpi 值恢复正常时,这个问题就再也不会出现了。 我的操作系统:Windows 7 x64,SWT 库:swt-4.3-win32-win32-x86.zip。 Eclipse IDE版本:Eclipse RCP Kepler,Java:1.6

这就是我设置标签布局数据的方式

public GridData buildENodeBTopLabelGridData() {
   eNBTopLabelGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
   eNBTopLabelGridData.heightHint = 17;
   eNBTopLabelGridData.widthHint = 200;
   return eNBTopLabelGridData;

}

这就是我的小部件在更改 DPI 之前的样子(默认值 -> 100%) http://img194.imageshack.us/img194/3134/e26e.png 这就是我的小部件如何看待更大的 DPI 值(在本例中为 110%) http://imageshack.us/photo/my-images/89/1o2t.png/

如果我在提问的地方或我的问题格式上犯了错误,我深表歉意。 提前致谢!

最佳答案

虽然这是一个老问题,但这是我在寻找解决方案时偶然发现的第一个问题,所以我想分享我的结果。然而,我为绝对(空)布局开发了它,而不是 GridLayout,因此必须针对其他布局对其进行调整。不过,总体思路可能会有所帮助。

SWT 有一种获取操作系统当前 DPI 的简单方法,即 Display.getDefault().getDPI()。在 Windows 中,默认 DPI(100%)是 96。因此我以此为起点比较当前 DPI 和默认 DPI,并根据结果缩放每个小部件。

//I used x here since x and y are always* the same.

public static final int DPI_CURRENT = Display.getDefault().getDPI().x;
public static final float DPI_DEFAULT = 96.0f;
public static final float DPI_SCALE = DPI_CURRENT / DPI_DEFAULT;

这将返回 DPI_SCALE,如果设置为 100%,则值为 1.0;如果设置为 150%,则为 1.5 等。

通过循环运行它以缩放应用程序窗口(和窗口本身)内的每个组件为我提供了所需的结果。

public static void scaleToDpi(Composite composite) {
    for(Control control : composite.getChildren()) {
        if(control instanceof Composite) {
            scaleToDpi((Composite) control);
        }
        scaleControl(control);
    }
}

private static void scaleControl(Control control) {
    int x = (int) (control.getLocation().x * DPI_SCALE);
    int y = (int) (control.getLocation().y * DPI_SCALE);
    int w = (int) (control.getSize().x * DPI_SCALE);
    int h = (int) (control.getSize().y * DPI_SCALE);

    control.setBounds(x, y, w, h);
}

这假设应用程序是为使用绝对定位的 100% DPI 设计的,并且在通过 scaleToDpi(shell);

运行缩放之前设置了每个小部件的大小

我希望这些信息对某些人有用,即使它与 GridLayout 没有直接关系。也感谢您在这里阅读我的第一个答案!

*在极少数情况下,DPI 的 xy 可能并不总是相同(我听说过)。

关于java - 如何根据 Windows DPI 计算 SWT 小部件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19900033/

相关文章:

java - 在扩展持久性上下文中管理实体的 JPA 最佳实践

ruby-on-rails - 为整个 Controller 使用不同的布局

Android 撰写文本溢出重量不起作用

java - 停止在 Eclipse 重新启动时打开 Viewparts 窗口

java - 如何根据 child 的高度自动设置对话框高度?

java - 每当将新数据点添加到 jfreechart 中的现有数据集时,xy 折线图如何自动更新/重绘

java - CrudRepository 上的 NullPointerException

android - FindViewByID(...) 在设置内容 View 和清理项目后返回 null

java - SWT Canvas 在重绘时不显示图像,除非其像素为 5x5

java - 调试流畅风格代码时,如何找到哪个链式方法失败?