我有一個Composite
包含一些Text
控件。我已將MouseListeners
附加到每個控件。爲什麼我會從控件邊界之外的位置獲取MouseDown事件?
有什麼令我驚訝的是,有時候,當我點擊一個控件時,我從它的鄰居那裏得到一個MouseDown
事件。事件的位置在控件的邊界之外,並且我沒有從我認爲我點擊過的另一個控件中獲得事件。
什麼會導致這種情況發生?
代碼片段
運行。按Esc關閉消息框。點擊字段BBBB。按Esc關閉MessageBox。點擊字段AAAA。該事件從字段BBBB生成。
public class Test
{
public class MyListener implements MouseListener, FocusListener
{
private boolean active;
@Override
public void focusGained(FocusEvent e)
{
System.out.println(e);
message((Text) e.widget, "FocusGained");
}
@Override
public void focusLost(FocusEvent e)
{
System.out.println(e);
}
@Override
public void mouseDoubleClick(MouseEvent e)
{
}
@Override
public void mouseDown(MouseEvent e)
{
System.out.println(e);
}
private void message(final Text t, final String m)
{
if (active == false)
{
active = true;
MessageBox mb = new MessageBox(t.getShell());
mb.setText(m);
mb.setMessage(t.getMessage() + "\n\n" + m);
mb.open();
active = false;
}
}
@Override
public void mouseUp(MouseEvent e)
{
System.out.println(e);
message((Text) e.widget, e.toString());
}
}
private MyListener listener = null;
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
new Test(shell);
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public Test(Composite parent)
{
listener = new MyListener();
create(parent);
}
private void create(Composite parent)
{
parent.setLayout(new GridLayout(2, true));
createText(parent, "AAAA");
createText(parent, "BBBB");
parent.layout(true);
}
private Text createText(Composite parent, String message)
{
Text t = new Text(parent, SWT.NONE);
t.setMessage(message);
GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
t.setLayoutData(gd);
t.addFocusListener(listener);
t.addMouseListener(listener);
return t;
}
}
嗨保羅,我假設你在Eclipse中使用WindownBuilder插件?有時它會產生錯誤的位置,而不是您在設計視圖中看到的位置。如果控制重疊,它們也可能導致這種失誤。 – bigneo
你能提供一個獨立的片段來展示你的desribe嗎? –
「x」和「y」位置是相對於小部件的,即基於小部件的左上角。你確定你看到的是在widget外面發生的事情嗎? 'MouseEvent#widget'指的是什麼? – Baz