2009-08-16 1 views
7

Как установить кнопку отмены в Swing JDialog, то есть кнопку, действие которой выполняется автоматически, если пользователь нажимает клавишу «Отмена» на клавиатуре?Кнопка отмены JDialog

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

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

+0

Угадайте, что вы имеете в виду ключ эвакуации. – NateS

ответ

1

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

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

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

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

Привет Богатый, спасибо, например. К сожалению, мне нужен полностью настраиваемый диалог с большим количеством различных элементов управления, а не только индивидуальный диалог параметров. Насколько я вижу, нет метода/перегрузки, которые можно передать полностью настроенной панели. –

+1

Я думаю, что вы правы, если у вас есть настраиваемый диалог, вам нужно будет реализовать обработку самостоятельно, однако вы можете списать обработку с JOptionPane. FWIW в SWT вы можете определить произвольный подкласс Dialog и вызвать его метод open() для его отображения. –

2

Однолинейного решения

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

где т является любым компонентом (кроме JButton), как JTextField в диалоговом окне.

+1

Второй аргумент метода 'put()' является ключом к карте действий, а не «Action». Это будет работать только в том случае, если 'btnCancel.getAction()! = Null', и если' Action', возвращенный 'btnCancel.getAction()', был зарегистрирован в карте действий для 't' с самим собой как ключ, т.е. если 't.getActionMap(). put (btnCancel.getAction(), btnCancel.getAction())' ранее был вызван. – Jesse

1

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

+0

Просто попробуйте ... это действительно работает –

+0

Вы не отвечаете на вопрос. Он собирался убрать диалог с нажатием клавиши, в общем, с клавишей Escape. По крайней мере, так я читаю вопрос, который немного неоднозначен, когда он перечитывает его. – PhiLho

+0

К сожалению, спасибо, что указали это. Вопрос должен быть прочитан «клавиша« отменить », а не« кнопка ». Я исправлю это. –

3

Лучший способ, который я вижу, - добавить 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, вы могли бы иметь 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(); 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^