Кнопка JDialog отменить

как я могу установить кнопку отмены в качели JDialog, т. е. кнопка, действие которой выполняется автоматически, если пользователь нажимает клавишу "Отмена" на клавиатуре?

аналог предлагается для действия по умолчанию через setDefaultButton метод корневой панели диалогового окна.

Если это помогает, я ищу аналог WinForms Form.CancelButton собственность.

4 ответов


Я не думаю, что это возможно с JDialog без его продления.

вы можете использовать JOptionPane.showOptionDialog () (или, возможно, один из других методов show), передавая кнопки, которые вы хотите использовать.

если переданные параметры являются компонентами, они будут отображаться как обычно, поэтому вы можете сделать что-то вроде этого:

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]);

самый лучший способ, который я вижу, это добавить Action на карту действий корневой панели и свяжите это действие с ключом escape, используя входную карту корневой панели.

для этого, вам нужен 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, вы могли бы actionPerformed() метод ActionListener вызов 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(){
    @Override
    public void actionPerformed(ActionEvent e)
    {
        onCancel();
    }
});

однострочное решение

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

где t-любой компонент (кроме JButton), например JTextField в диалоговом окне.


все, что вам нужно сделать, это прикрепить прослушиватель действий к кнопке и вызвать dialog.setVisible(false) внутри него.