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

这完全取决于外观,AFAIK。在您的 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。给它一个消息标签、一个图标占位符和两个按钮。现在制作与您正在使用的 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 回答