2009-06-26 21 views
3

テキスト、コンボ、ツリーなどの一般的なウィジェットを作成するダイアログクラスを作成しました。入力したウィジェットが押されたときに、デフォルトの「OK」ボタンが押されたのと同じように、このダイアログを閉じるようにデフォルトの動作をするのは面倒です。SWTダイアログで入力/戻りキーをグローバルに無効にする

この現象を防ぐには、トラバースキーをフィルタリングする各ウィジェットのリスナー:

if (SWT::TRAVERSE_RETURN == event.detail) { 
    event.doit = false 
} 

これは多少面倒です。ダイアログレベルでグローバルに行う方法はありますか?

+0

@bryantsaiフィードバックをいただきありがとうございます。この問題を解決した場合は、ここに回答を投稿することを忘れないでください(公式回答として選択することができます) – VonC

答えて

0

this threadによると、これはまたSnippet127によって示される唯一の方法、のようだ(「制御不能トラバースからタブを防ぐ」)

このDialog classが彼らのkeyTraversed()TraverseListenerのグローバルな使用を示しかもしれませ方法。

+0

ダイアログクラスにTraverseListenerを実装することで、イベントは個々のウィジェットに最初に行き、「多分」そのダイアログを表示します(私はこの動作を観察することができないので、わかりません)。とにかく、ダイアログクラスでグローバルに定義することは解決策ではないようです。 – bryantsai

0

完全なダイアログの動作を防ぐために、デフォルトのボタンをnull(Shell#setDefaultButton(null))に設定することもできます。それ以外の場合は、Enterキーを押さないウィジェットを選択する必要があります。

0

この問題に対する私の解決策は、これまでのところうまくいくように見えますが、不可視の無効化されたボタンを作成し、それをシェルのデフォルトボタンとして設定することです。レイアウトの残りの部分が乱れるのを避けるために、私はcreateButtonsForButtonBar()に渡された親を使用してダイアログのボタンバーにボタンを作成しました。

final Button hiddenButton = new Button(parent, SWT.PUSH); 
    hiddenButton.setVisible(false); 
    hiddenButton.setEnabled(false); 
    parent.getShell().setDefaultButton(hiddenButton); 

ここで、すべてのデフォルト選択イベントがそのボタンを押します。これは、望むように、何もしません。

+1

これはかなり悪い解決策です。imho – iberbeu

3

JFaceダイアログでは、createButtonsForButtonBarメソッドをオーバーライドすることでデフォルトのEnterキーを無効にすることが簡単に分かりました。

との最後のパラメータ:

createButton(親、IDialogConstants.OK_ID、IDialogConstants.OK_LABEL、 偽)。

ニーズfalseにする:

@Override 
protected void createButtonsForButtonBar(Composite parent) { 
Button button = createButton(parent, IDialogConstants.OK_ID, 
     IDialogConstants.OK_LABEL, false); 
} 
0

私の答えが遅すぎると、おそらく私の解決策は、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; 
    } 
}); 

このリスナーはバックイベントを有効にし、デフォルトボタンがトリガされます。

関連する問題