我面临的问题是,当我将个性化中的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/
很抱歉,如果我在提问的地方或问题的格式方面犯了错误。 提前谢谢!
答案 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的x
和y
可能并不总是相同。