如何根据Windows DPI计算SWT窗口小部件大小

时间:2013-11-11 06:18:54

标签: java layout swt dpi

我面临的问题是,当我将个性化中的DPI值 - > display-> custom 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/

很抱歉,如果我在提问的地方或问题的格式方面犯了错误。 提前谢谢!

1 个答案:

答案 0 :(得分:2)

虽然这是一个老问题,但这是我在寻找解决方案时偶然发现的第一个,所以我想分享我的结果。我为绝对(null)布局开发了这个,但不是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;

如果设置为100%,则返回DPI_SCALE,值为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可能并不总是相同。