我面临的问题是,当我将个性化 -> 显示 -> 自定义 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 的 x
和 y
可能并不总是相同(我听说过)。
关于java - 如何根据 Windows DPI 计算 SWT 小部件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19900033/