Java-рецепты. Кнопка по умолчанию

Java-рецепты. Кнопка по умолчанию

При работе с диалоговыми окнами иногда очень удобно использовать так называемую кнопку по умолчанию. Т.е. кнопку, которая автоматически нажималась бы при нажатии клавиши 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

©1997-2024 Компьютерная газета