6

次のようなオプション ダイアログがあります。

String[]  options = ["Yes", "No"]; //button names

int n = JOptionPane.showOptionDialog(singleFrameService.getFrame(),
        "Some Question?",
        "",
        JOptionPane.YES_NO_OPTION,
        JOptionPane.QUESTION_MESSAGE,
        null,     //do not use a custom Icon
        options,  //the titles of buttons
        options[0]); //default button title

//if press yes
if (n == JOptionPane.YES_OPTION){
    //make some if pressed Yes
}

マウスを使用してはい/いいえを押すと、すべて正常に動作します...しかし、キーボードの使用を開始するときに、TABを押して「いいえ」ボタンに移動し、ENTERを押して「はい」オプションを操作します

4

5 に答える 5

13

これにより、uimanager がフォーカスされたボタンを処理します。これにより、エンターまたはスペースの両方を使用して、フォーカスされたボタンを選択できます。

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
于 2013-06-04T17:29:55.970 に答える
10

それはすべてルックアンドフィールに依存します。あなたの L&F では、「Enter」は「デフォルトのボタンを押す」(はい) を意味します。フォーカスされたボタンを押すには、おそらくスペース バーを押します。

于 2012-05-01T08:26:09.870 に答える
1

JOptionPane がスペース キーに応答するのと同じ方法でリターン キーに応答する必要がありましたが、これが成功した方法です。JOPtionPane の新しいインスタンスを作成し、その createDialog メソッドを呼び出してダイアログ ウィンドウを取得しました。

次に、そのダイアログ ウィンドウを以下の listComponents(java.awt.Container) メソッドに渡しました。

    private static index=0;
private static void listComponents(java.awt.Container c){
        if(c==null)return;
        for(java.awt.Component cc:c.getComponents())
            listComponents((java.awt.Container)cc);
        if(c instanceof javax.swing.JButton){
            buttons[index++]=(javax.swing.JButton)c;
            javax.swing.InputMap inputMap=buttons[index-1].getInputMap(javax.swing.JComponent.WHEN_FOCUSED);
            javax.swing.Action spaceAction=buttons[index-1].getActionMap().get(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_SPACE,0));
            inputMap.put(javax.swing.KeyStroke
.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER,0),spaceAction);
        }
    }
于 2013-01-17T14:39:54.773 に答える
0

JB Nizetの回答に加えて、私がよく理解していれば、Javaでの入力処理はこのように行われることに言及したいと思います。

  1. フォーカスされたウィンドウにあるコンポーネント
  2. フォーカスがあるコンポーネント
  3. フォーカスされたコンテナの祖先であるコンポーネント

すべて追加された順序とは逆の順序です(私はそれについて100%ではありませんが、それは論理的です)。これで、inputEventを使用できます。この場合、入力されたJOptionPaneレジスタ押され、入力イベントにバインドされたアクションを持つコンポーネントのコレクションをトラバースします。yesボタンは、デフォルトのボタンとしてこのイベントを消費するため、他のコンポーネントはそれを使用して何もできません。

問題の解決策は、カスタムJDialogを作成する必要があるということです。メッセージのラベル、アイコンのプレースホルダー、および2つのボタンを付けます。次に、使用しているJOptionPaneと同じコンストラクターを作成し、コンストラクターが受け取るパラメーターに従って各コンポーネントにテキスト/アイコンを指定します。

于 2012-05-01T08:44:40.353 に答える
0

JB Nizetの回答への追加ENTERキーを使用してボタンにアクセスできない場合は、Yes, Noそのキーを無効にすることをお勧めします。ここにいくつかの例があります:

public class NewClass {

public static void main(String[] args) {
    JFrame frame = new JFrame();
    String[] options = {"Yes", "No"};

    int n = JOptionPane.showOptionDialog(frame,
            "Some Question? Press space bar to continue...",
            "",
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null, //do not use a custom Icon
            options, //the titles of buttons
            null); // disabled the ENTER Key

    System.out.println(n);

    if (n == JOptionPane.YES_OPTION) {
        System.out.println("Yes");
    } else {
        System.out.println("No");
    }


    System.exit(1);
}
}
于 2012-05-01T09:14:36.593 に答える