繁体   English   中英

每个按钮上的JOptionPane.YES_OPTION == ENTER

[英]JOptionPane.YES_OPTION == ENTER on each button

我有一个像这样的选项对话框:

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键 - 工作“是”选项

这将使uimanager处理聚焦按钮。 这将允许您使用输入或空格来选择聚焦按钮。

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);

这一切都取决于外观'A feelik,AFAIK。 在L&F中,“输入”表示“按默认按钮”(即“是”)。 可以通过按空格键来按下聚焦按钮。

我需要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);
        }
    }

除了JB Nizet的回答之外,我想提一下java中的输入处理是这样的,如果我理解得很好:

  1. 聚焦窗口中的组件
  2. 具有焦点的组件
  3. 作为焦点容器的祖先的组件

所有这些都与它们的添加顺序相反(我不是100%关于这一点,但这是合乎逻辑的)。 现在,可以使用 inputEvent。 在这种情况下,按下了输入的JOptionPane寄存器,并遍历具有绑定到输入事件的操作的组件集合。 yes按钮,默认按钮消耗这一事件使其他组件可以用它做任何事情。

您的问题的解决方案是您将不得不创建自定义JDialog。 给它一个消息标签,一个图标占位符和两个按钮。 现在使用与您正在使用的JOptionPane相同的构造函数,并根据构造函数接收的参数为每个组件提供文本/图标。

除了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);
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM