我注意到功能Control#setLocation(int, int)
的一個問題。我用它來同步兩個Shell
之間的移動,即如果我移動第一個,第二個移動相同數量的像素。控制集偏移4px在Windows 7上
這一切都正常工作,除了一件小事:調用setLocation()
後Shell
的實際位置偏移4像素(在Windows 7上,沒有得到改變,在另一個操作系統上測試它)。
下面是說明該問題的示例程序:
public class StackOverflow
{
public static void main(String[] args)
{
Display display = new Display();
final Shell shell = new Shell();
shell.setLayout(new GridLayout(5, true));
for (int i = 0; i < 25; i++)
new Label(shell, SWT.NONE).setText("Label: " + i);
final Shell otherShell = new Shell(shell);
otherShell.setLayout(new FillLayout());
new Button(otherShell, SWT.PUSH).setText("Button");
Listener synchronizeMovement = new Listener()
{
@Override
public void handleEvent(Event event)
{
Rectangle parentBounds = shell.getBounds();
Rectangle displayBounds = Display.getDefault().getBounds();
Point size = otherShell.getSize();
/* Check if there's sufficient space to the right of the parent */
if ((displayBounds.width - (parentBounds.width + parentBounds.x)) >= size.x)
{
otherShell.setLocation(parentBounds.x + parentBounds.width, parentBounds.y);
System.out.println(parentBounds + " -> (" + (parentBounds.x + parentBounds.width) + ", " + parentBounds.y + ")");
}
}
};
shell.addListener(SWT.Move, synchronizeMovement);
otherShell.addListener(SWT.Show, synchronizeMovement);
shell.pack();
shell.open();
otherShell.pack();
otherShell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
}
如果我以這樣的方式定位在主窗口,該輸出是
矩形{124,100,276, 143} - >(400,100)
我得到以下人工測量後的結果:
這使我得出的結論是有一個抵消/邊界/保證金/無論涉及,我不知道。
期望的結果是調用setLocation(400, 100)
導致Shell
位於「(400,100)」而不是「(396,96)」(這應該是一個合理的假設,對嗎?)。
有沒有人有詳細的見解,爲什麼這是這種情況,以及如何解決它?
更新
如果我使用SWT.NO_TRIM
爲otherShell
的風格它工作得很好。所以它必須與窗飾(框架)有關。
這是值得這項工作在Mac OS X上正確工作 –
謝謝@ greg-449,這是很好的知道。當我回家時,我會在Linux上嘗試它。 – Baz
SWT是否有像AWT這樣的getInsets()函數? getInsets()返回AWT中Frame的邊框大小。也許SWT有類似的功能。 –