5

我面临的问题是,当我将个性化->显示->自定义 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/

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

4

1 回答 1

7

虽然这是一个老问题,但这是我在寻找解决方案时偶然发现的第一个问题,所以我想分享我的结果。我为绝对(空)布局开发了这个,但不是 a 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可能并不总是相同(我听说过)。

于 2017-03-24T15:17:02.380 回答