Java-рецепты. Кнопка по умолчанию
Java-рецепты. Кнопка по умолчанию
При работе с диалоговыми окнами иногда очень удобно использовать так называемую кнопку по умолчанию. Т.е. кнопку, которая автоматически нажималась бы при нажатии клавиши Enter. Количество примеров диалогов, в которых было бы удобно иметь подобную кнопку, огромно — начиная с диалоговых окон, которые запрашивают у пользователя ввод какого-нибудь значения, и заканчивая диалогами задания параметров приложения.
Решить данную проблему несложно. Для этого предназначен специальный метод setDefaultButton() класса JRo-otPane. Текущий объект класса JRoot Pane вашего диалога можно получить с помощью метода getRootPane(). Если вы работаете с панелью, для которой заранее имеется ссылка на объект диалога или фрейма, то решение сводится к одной из следующих строчек кода в зависимости от контекста:
В этом случае можно воспользоваться классом SwingUtilities и получить объект корневой панели (JRoot Pane) для вашего объекта JPanel во время выполнения программы. Как только мы получили эту корневую панель, остается лишь вызвать метод setDefaultButton(), как показано ниже:
В листинге приведен пример Swing-приложения, которое состоит из одного фрейма с кнопкой для вызова диалогового окна. В диалоговом окне содержится список (JList) и две кнопки (JButton), одна из которых — OK. Она и будет кнопкой по умолчанию. Т.е. после того, как пользователь выберет элемент из предложенного списка и нажмет клавишу Enter, произойдет эмуляция нажатия кнопки OK.
Если у вас есть какие-нибудь вопросы по поводу разработки Java-приложений — пишите.
Алексей Литвинюк, litvinuke@tut.by
При работе с диалоговыми окнами иногда очень удобно использовать так называемую кнопку по умолчанию. Т.е. кнопку, которая автоматически нажималась бы при нажатии клавиши Enter. Количество примеров диалогов, в которых было бы удобно иметь подобную кнопку, огромно — начиная с диалоговых окон, которые запрашивают у пользователя ввод какого-нибудь значения, и заканчивая диалогами задания параметров приложения.
Решить данную проблему несложно. Для этого предназначен специальный метод setDefaultButton() класса JRo-otPane. Текущий объект класса JRoot Pane вашего диалога можно получить с помощью метода getRootPane(). Если вы работаете с панелью, для которой заранее имеется ссылка на объект диалога или фрейма, то решение сводится к одной из следующих строчек кода в зависимости от контекста:
getRootPane().setDefaultButton(my Button); // если this, это JDialog или JFrame myDialog.getRo otPane().setDefault Button(myButton); // если имеется доступ к ссылке на объект диалога (JDialog) my Frame.getRootPane().setDefaultButton(myButton); // если имеется доступ к ссылке на объект фрейма (JF rame)Однако, если вы работаете с панелями, представленными в виде бинов (Java Beans), и при этом они не зависят ни от диалога, ни от фрейма, то следующий вызов getRootPane(). setDefaultButton(myButton); приведет к выбросу исключения NullPointer Exception.
В этом случае можно воспользоваться классом SwingUtilities и получить объект корневой панели (JRoot Pane) для вашего объекта JPanel во время выполнения программы. Как только мы получили эту корневую панель, остается лишь вызвать метод setDefaultButton(), как показано ниже:
myRootPane = SwingUtilities.get RootPane(myComponent); // получаем корневую панель компонента myComponent myRootPane.setDefaultButton(my Button); // устанавливаем кнопку по умолчаниюОднако более изящно можно было бы подойти к решению поставленной задачи, создав собственный класс, производный от JPanel, с перегруженным методом addNotify(). Именно внутри этого метода мы и будем устанавливать кнопку по умолчанию, как мы делали это выше.
В листинге приведен пример Swing-приложения, которое состоит из одного фрейма с кнопкой для вызова диалогового окна. В диалоговом окне содержится список (JList) и две кнопки (JButton), одна из которых — OK. Она и будет кнопкой по умолчанию. Т.е. после того, как пользователь выберет элемент из предложенного списка и нажмет клавишу Enter, произойдет эмуляция нажатия кнопки OK.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DefaultButtonEx ample { public static void main(String[] args) { final JFrame myFrame = new JFra-me("Default Bu tton Example"); myFrame.setDefaultCloseOpera-tion(JFrame.EXIT_ON_CLOSE); JButton frmButton = ne w JButton ("Показать диалог"); frmButton.addActionListener(new ActionListener(){ public vo id actionPerformed (ActionEvent e) { JDialog myDlg = new JDialog (myFrame, "Диалог", true) ; myDlg.setContentPane(new CustomPanel()); myDlg.pack(); myDlg.show(); } }); myFrame.getContentPane( ).add(frmBut-ton); myFrame.pack(); myFrame.show(); } } /** Класс нашей панели с перегруженным методо м addNotify() */ class CustomPanel extends JPanel { private JList myList = new JList (new String[] { "Выбор 1", "Выбор 2", "Выбор 3", "Выбор 4"}); private JButto n btnOK = new JBut-ton("O.K."); CustomPanel() { super(new BorderLayout()); add(myList); JP anel southPanel = new JPanel (new GridLayout(2,1)); southPanel.add(new JButton ("Отмена")) ; southPanel.add(btnOK); add(southPanel, BorderLayout. SOUTH); btnOK.addActionListener(new ActionLis tener(){ public void actionPerformed (ActionEvent e) { System.out.println(myList. getSelectedValue() ); } }); } public void addNotify() { super.addNotify(); // выполняем стандартную логику метода addNo tify() JRootPane myRootPane = Swing Utilities.getRootPane(this); // получаем корневую панель if (myR ootPane == null) System.out.println("Невозможно получить объект класса JRootPane"); else m yRootPane.setDefaultButton (btnOK); // устанавливаем кнопку по умолчанию } }Многие разработчики очень часто не обращают внимания на такие, казалось бы, "мелочи" и уделяют больше времени проработке бизнес-логики своих приложений. Такой подход чаще всего хорош на стадии проектирования приложений. Если же совсем не заботиться о юзабилити (usability) разрабатываемого приложения, то пользователям работать с такой программой будет, по меньшей мере, неудобно. А из этого следует, что к вам как разработчику будет больше претензий. Чтобы их избежать, лучше подходить к разработке программ с точки зрения пользователя и заранее учитывать его потребности.
Если у вас есть какие-нибудь вопросы по поводу разработки Java-приложений — пишите.
Алексей Литвинюк, litvinuke@tut.by
Компьютерная газета. Статья была опубликована в номере 44 за 2003 год в рубрике программирование :: java