2012-05-01 3 views
4

У меня есть диалог опций вроде этого:JOptionPane.YES_OPTION == ENTER на каждой кнопке

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 - выберите «Да»

+0

Что вы имеете в виду, «работайте с параметром да»? Вы хотите, чтобы он использовал параметр «да» или вы хотите, чтобы он сделал «нет»? – MarioDS

+0

Я хочу делать «нет», нет == JOptionPane.NO_OPTION; В моем коде нет работы Нет == JOptionPane.YES_OPTION как «Да» –

+0

@MarioDeSchaepmeester: Олег Бит означает, что, когда он пытался использовать «ENTER_KEY» поверх опции «Нет», он все еще обрабатывает условие 'if (n == JOptionPane.YES_OPTION) { // сделать некоторые, если нажаты Да } ' – Crazenezz

ответ

9

Все зависит от внешнего вида, AFAIK. В вашем L & F «Ввод» означает «нажмите кнопку по умолчанию» (это «Да»). Нажатие сфокусированной кнопки, вероятно, выполняется нажатием пробела.

+0

фокус находится на «Нет», а затем нажмите ENTER –

+2

Я понимаю это. Я сказал «Ввод» означает «Нажмите кнопку * по умолчанию». Что отличается от «Нажмите кнопку * сфокусирован». Чтобы нажать кнопку * сфокусированный *, используйте пробел. –

+0

Он получил бы давление от моей спины, если бы был простой способ заставить «Y» и «N» работать на «да» и «нет». Существует большая устойчивость к использованию ключа пробела для опции по умолчанию. Я знаю, что это стандарт, но большинство людей этого никогда не делали - они используют мышь. У меня, однако, есть незавидная задача портировать 20-летнее приложение DOS на более современную платформу, и люди хотят, чтобы он работал ТОЧНО, как старый, и они не хотят поднимать руки с клавиатуры. Боже, помоги мне! –

0

В дополнении к ответу JB Nizet, я хотел бы отметить, что ввод обработки в Java идет именно так, если я понимаю, это хорошо:

  1. Компоненты, которые находятся в сосредоточенном окне
  2. Компонента, имеет фокус
  3. компонент, который является предком сфокусированного контейнера

Все в порядке, обратном порядку, как они были добавлены (я не 100% об этом, но это было бы ло гическое). Теперь, inputEvent может быть потребляется. В этом случае JOptionPane регистрирует, что нажата кнопка , и проходит через коллекцию компонентов, которые имеют действия, связанные с событием ввода. Кнопка yes, так как кнопка по умолчанию потребляет это событие, чтобы никакие другие компоненты ничего не могли с этим поделать.

Решение проблемы заключается в том, что вам придется создавать пользовательский JDialog. Дайте ему ярлык для сообщения, заполнитель для значка и две кнопки. Теперь создайте тот же конструктор, что и JOptionPane, который вы используете, и дайте каждому компоненту текст/значок в соответствии с параметрами, которые получает конструктор.

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); 
} 
} 
+1

Хотя код делает то, что вы описываете, как пользователь, я не был бы очень доволен этим поведением. Я не знаю, какая ОС используется, и какой Look-and-feel, но встреченное поведение вполне может соответствовать поведению ОС по умолчанию. И как пользователь, я бы предпочел, чтобы мое приложение Java работало таким же образом и не игнорировало мой ключ ENTER – Robin

+0

@Robin: я согласен с вашим утверждением как пользователем, я обновлю свой ответ, если у меня есть что-то более настраиваемое для этой вещи , – Crazenezz

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); 
     } 
    } 
10

Это сделает ручку uimanager сфокусированной кнопкой. Это позволит вам использовать как ввод, так и пробел, чтобы выбрать сфокусированную кнопку.

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE); 
Смежные вопросы