【问题标题】:JDialog cancel buttonJDialog 取消按钮
【发布时间】:2010-11-20 00:54:41
【问题描述】:

如何在 Swing JDialog 中设置取消按钮,即如果用户按下键盘上的“取消”键,该按钮的操作会自动执行?

通过对话框根窗格的setDefaultButton 方法为默认操作提供对应项。

如果这有帮助,我正在寻找 WinForms Form.CancelButton 属性的类似物。

【问题讨论】:

    标签: java swing hig


    【解决方案1】:

    如果不扩展 JDialog,我认为这是不可能的。

    您可以使用 JOptionPane.showOptionDialog()(或可能的其他显示方法之一),传递您想要使用的 JButton。

    如果传递的选项是组件,它们将被正常渲染,所以你可以这样做:

    int optionType = JOptionPane.DEFAULT_OPTION;
    int messageType = JOptionPane.PLAIN_MESSAGE; // no standard icon
    
    JButton ok = new JButton("ok");
    JButton cancel = new JButton("cancel");
    //add any handlers to the buttons
    ...
    //construct options
    Object[] selValues = { ok, cancel };
    
    //show dialog as normal, selected index will be returned.
    int res = JOptionPane.showOptionDialog(null, "message",
            "title", optionType, messageType, null, selValues,
            selValues[0]);
    

    【讨论】:

    • 您好 Rich,感谢您提供的示例。不幸的是,我需要一个包含许多不同控件的完全自定义的对话框,而不仅仅是一个个性化的选项对话框。据我所知,没有方法/重载可以传递给完全自定义的面板。
    • 我认为你是对的,如果你有一个自定义对话框,你需要自己实现处理,但是你可以从 JOptionPane 中删除处理。 SWT 中的 FWIW 可以定义任意的 Dialog 子类并调用它的 open() 方法来显示它
    【解决方案2】:

    单线解决方案

    t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
       .put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction());
    

    其中 t 是对话框中的任何组件(JButton 除外),例如 JTextField。

    【讨论】:

    • put() 方法的第二个参数是动作映射的键​​,而不是Action。这只有在btnCancel.getAction() != nullbtnCancel.getAction() 返回的Actiont 的操作映射中注册且其自身作为键时才有效,即。如果之前调用过 t.getActionMap().put(btnCancel.getAction(), btnCancel.getAction())
    【解决方案3】:

    您所要做的就是将动作侦听器附加到按钮并在其中调用dialog.setVisible(false)

    【讨论】:

    • 你没有回答这个问题。它即将通过击键关闭对话框,通常使用 Escape 键。至少我是这样阅读问题的,重新阅读时有点模棱两可。
    • 糟糕,感谢您指出这一点。问题应该是“‘取消’键”,而不是“按钮”。我会解决的。
    【解决方案4】:

    我能看到的最好方法是将Action 添加到根窗格的操作映射中,并使用根窗格的输入映射将该操作链接到转义键。

    为此,您需要一个Action。如果您的取消按钮的行为被实现为一个动作(即cancelButton.getAction() != null),那么这将起作用:

    getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); getRootPane().getActionMap().put("CANCEL", cancelButton.getAction());

    否则,如果取消按钮的逻辑是通过ActionListener 实现的,您可以让ActionListeneractionPerformed() 方法调用实现逻辑的private void onCancel() 方法,并注册一个“取消”操作调用相同的方法。

    getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); getRootPane().getActionMap().put("CANCEL", new AbstractAction(){ @覆盖 公共无效actionPerformed(ActionEvent e) { onCancel(); } });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多