私の答えが遅すぎると、おそらく私の解決策は、2009年には不可能だったように見えます...しかし、いずれにせよ、私はそれを投稿してください。
この問題はDisplay.addFilter
で解決できます。プログラムの先頭にトラバースイベントのフィルタを追加する必要があります。
Display.getDefault().addFilter(SWT.Traverse, new Listener() {
@Override
public void handleEvent(Event event) {
if(SWT.TRAVERSE_RETURN == event.detail) {
System.out.println("Global SWT.TRAVERSE_RETURN");
event.doit = false;
}
};
});
後には、ダイアログを作成し、そのデフォルトボタンは機能しません:
Shell shell = new Shell(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
shell.setLayout(new GridLayout(2, false));
shell.setSize(250, 100);
Label loginLabel = new Label(shell, SWT.NONE);
loginLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
loginLabel.setText("Login");
Text text = new Text(shell, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
Composite buttonsContentComposite = new Composite(shell, SWT.NONE);
buttonsContentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
buttonsContentComposite.setLayout(new GridLayout(2, false));
Button okButton = new Button(buttonsContentComposite, SWT.PUSH);
okButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
okButton.setText("Ok");
okButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
System.out.println("Ok");
};
});
Button cancelButton = new Button(buttonsContentComposite, SWT.PUSH);
cancelButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
cancelButton.setText("Cancel");
cancelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
System.out.println("Cancel");
};
});
shell.setDefaultButton(okButton);
shell.open();
while (!shell.isDisposed()) {
if(!Display.getCurrent().readAndDispatch()) {
Display.getCurrent().sleep();
}
}
フィルターキャッチトラバースイベントを、デフォルトのボタンは機能しませんので、シェルに送信禁止します。 しかし、この解決策は、1つのニュアンスを持っている - あなたはシェルのトラバースリスナーを追加し、グローバルなフィルタ効果を無効にすることができます
shell.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent event) {
event.doit = true;
}
});
このリスナーはバックイベントを有効にし、デフォルトボタンがトリガされます。
@bryantsaiフィードバックをいただきありがとうございます。この問題を解決した場合は、ここに回答を投稿することを忘れないでください(公式回答として選択することができます) – VonC