2013-04-08 4 views
1

Я разрабатываю приложение Java Swing.JOptionPane - добавить keylistener для showOptionDialog

Когда я выхожу из приложения, опцияDialog выскочит, и он спросит меня, хочу ли я сохранить файл перед выходом.

То, что я хочу сделать, это есть три кнопки на optionDialog (ДА, НЕТ, ОТМЕНА) Я хочу сделать optionDialog изменить фокус кнопки стрелки ключа вместо язычком ключа. Как создать ключевой прослушиватель для кнопки в опцииDialog?

До сих пор, вот мой код

Object[] options = {" YES "," NO ","CANCEL"}; 

int n = JOptionPane.showOptionDialog(Swing4.this, 
     "File haven't save yet." + 
     " \n Are you want to save the file?",         
     "Confirm Dialog", 
     JOptionPane.YES_NO_CANCEL_OPTION, 
     JOptionPane.QUESTION_MESSAGE, 
     null,  //do not use a custom Icon 
     options, //the titles of buttons 
     options[1]); //default button title     

if(n == JOptionPane.YES_OPTION){    
    if(helper.updateFile("text.txt", gatherAllContent(), Swing4.this)){ 
     System.exit(0); 
    } 
    label.setText("There is something wrong on quit"); 

}else if(n == JOptionPane.NO_OPTION){ 
    System.exit(0); 
}else if(n == JOptionPane.CANCEL_OPTION){ 
    System.out.println("Cancel"); 
} 

ответ

5

Это не possbile сделать это с showOptionDialog, вместо этого вам нужно создать JOptionPane для себя. То, что вы ищете, это Container.getFocusTraversalKeys(). Вот рабочий фрагмент кода, чтобы изменить кнопку фокусировки с помощью правой клавиши (Tab все еще работает):

JOptionPane optionPane = new JOptionPane("File haven't save yet." + 
      " \n Are you want to save the file?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION); 
    JDialog dialog = optionPane.createDialog("Confirm Dialog"); 
    Set<AWTKeyStroke> focusTraversalKeys = new HashSet<AWTKeyStroke>(dialog.getFocusTraversalKeys(0)); 
    focusTraversalKeys.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED)); 
    dialog.setFocusTraversalKeys(0, focusTraversalKeys); 
    dialog.setVisible(true); 
    dialog.dispose(); 
    int option = (Integer) optionPane.getValue(); 
+0

Ya! Это именно то, что я ищу! Вот мой другой вопрос. Как узнать, какую кнопку я нажал? JOptionPane.showOptionDialog возвращает результат нажатия кнопки. В этом случае, какой метод я должен использовать для получения результата – edisonthk

+0

См. Отредактированный ответ. :) –

2

Когда я выйти из приложения, optionDialog выскочит и спросит меня, если я хочу, чтобы сохранить файл перед бросить курить.

, например

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ClosingFrame extends JFrame { 

    private JMenuBar MenuBar = new JMenuBar(); 
    private JFrame frame = new JFrame(); 
    private static final long serialVersionUID = 1L; 
    private JMenu File = new JMenu("File"); 
    private JMenuItem Exit = new JMenuItem("Exit"); 

    public ClosingFrame() { 
     File.add(Exit); 
     MenuBar.add(File); 
     Exit.addActionListener(new ExitListener()); 
     WindowListener exitListener = new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       int confirm = JOptionPane.showOptionDialog(frame, 
         "Are You Sure to Close this Application?", 
         "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
         JOptionPane.QUESTION_MESSAGE, null, null, null); 
       if (confirm == JOptionPane.YES_OPTION) { 
        System.exit(1); 
       } 
      } 
     }; 
     frame.addWindowListener(exitListener); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setJMenuBar(MenuBar); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private class ExitListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == JOptionPane.YES_OPTION) { 
       System.exit(1); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClosingFrame cf = new ClosingFrame(); 
      } 
     }); 
    } 
} 
+0

Я очень ценю ваш приятный и понятный ответ. Но я спрашиваю, как добавить что-то вроде keylistener в JOptionPane.showOptionDialog. Извините, что вопрос не задан с очень хорошим английским – edisonthk

+0

не согласен с KeyListener во всех случаях, с графическим интерфейсом Swing, вместо создания (задания в течение нескольких минут) создать собственный JDialog (setDefaultCloseOparation.HIDE_ON_CLOSE) с тремя JButtons, добавить Swing Action, ActionListener для каждого JButtons, создайте этот JDialof только один раз, скрывая этот контейнер вместе с событием JButtons – mKorbel

1

Улучшение после принятого ответа Нандор в ... Это позволит вам перемещаться в обратном направлении с левой стрелкой, а также избежать NullPointerException при закрытии диалога с помощью X.

public int showConfirmDialog(Component parent, String message, String title) 
{ 
    JOptionPane optionPane = new JOptionPane(message, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION); 
    JDialog dialog = optionPane.createDialog(parent, title); 

    Set forwardTraversalKeys = new HashSet(dialog.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); 
    forwardTraversalKeys.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.VK_UNDEFINED)); 
    dialog.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardTraversalKeys); 

    Set backwardTraversalKeys = new HashSet(dialog.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS)); 
    backwardTraversalKeys.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_LEFT, KeyEvent.VK_UNDEFINED)); 
    dialog.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardTraversalKeys); 

    dialog.setVisible(true); 
    dialog.dispose(); 

    Integer ret = (Integer) optionPane.getValue(); 
    if (ret == null) 
    { 
     return JOptionPane.CANCEL_OPTION; 
    } 
    return ret.intValue(); 
} 
Смежные вопросы