Перевод на русский © Сергей Миссан, 2000
Оригинал статьи опубликован на сайте Javable.com
Java Q&A
Возможно ли сделать поддержку help tips для меню в Swing?
В компьютерном мире достаточно распространены приложения, показывающие краткую справку (help tip) в строке статуса, когда пользователь выбирает один из элементов меню. Я был удивлен тем, что набор компонентов меню в Swing не поддерживает такую возможность. Есть ли способ создать такую функциональность, не создавая подкласс одного из огромных классов Swing? Мне удалось заставить работать таким образом неизмененный класс JMenuItems:
myMenu.add(new JMenuItem("Save As..."));
создавая подкласс JMenuItems и перекрывая метод menuSelectionChanged(). К сожалению, так нельзя поступить ни с элементами меню, созданными с помощью action (которая возвращает чистый JMenuItem), ни с JCheckBoxMenuItems или JRadioButtonMenuItems.
Я использую JDK 1.2.2 FCS.
Эксперты Java Q&A рекомендуют использовать делегирование к базовому adapter class вместо наследования, для того, чтобы получить требуемую функциональность.
Adapter class возьмет JMenuItem, строку (String) со справочной информацией и JLabel, как строку статуса для отбражения сообщения. В момент выбора элемента меню adapter class отобразит соответствующий текст в строке статуса.
Сложная часть этой задачи: как обнаружить, какое событие мы должны отслеживать? Оказывается, ChangeEvent создается, когда активируется или деактивируется элемент меню. В Java для этого используется термин arming элемента меню. Таким образом, мы можем написать следующий adapter class:
class MenuHelpTextAdapter implements ChangeListener { private JMenuItem menuItem; private String helpText; private JLabel statusBar; public MenuHelpTextAdapter( JMenuItem menuItem, String helpText, JLabel statusBar) { this.menuItem = menuItem; this.helpText = helpText; this.statusBar = statusBar; menuItem.addChangeListener(this); } public void stateChanged(ChangeEvent evt) { if (menuItem.isArmed()) statusBar.setText(helpText); else statusBar.setText(" "); } }
Код, который создает adapterы для элементов меню достаточно прост:
new MenuHelpTextAdapter( item1, " Help text for item 1", statusBar); new MenuHelpTextAdapter( item2, "Item 2 info", statusBar);
Используя этот adapter, как внутренний класс в данном случае, мы можем создать полную программу:
import java.awt.event.*; import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class StatusBarTest { JLabel statusBar; JMenuItem item1; JMenuItem item2; private void init() { JFrame frame = new JFrame("Status Bar Test"); JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); JMenu fileMenu = new JMenu("File"); menuBar.add(fileMenu); item1 = new JMenuItem("Item 1"); item2 = new JMenuItem("Item 2"); fileMenu.add(item1); fileMenu.add(item2); Container contentPane = frame.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add( "Center", new JButton( "Main application area")); statusBar = new JLabel(" "); contentPane.add("South", statusBar); new MenuHelpTextAdapter( item1, "Help text for item 1", statusBar); new MenuHelpTextAdapter( item2, "Item 2 info", statusBar); frame.setSize(400,400); frame.setVisible(true); } public static void main(String[] args) { StatusBarTest t = new StatusBarTest(); t.init(); } class MenuHelpTextAdapter implements ChangeListener { private JMenuItem menuItem; private String helpText; private JLabel statusBar; public MenuHelpTextAdapter( JMenuItem menuItem, String helpText, JLabel statusBar) { this.menuItem = menuItem; this.helpText = helpText; this.statusBar = statusBar; menuItem.addChangeListener(this); } public void stateChanged (ChangeEvent evt) { if (menuItem.isArmed()) statusBar.setText(helpText); else statusBar.setText(" "); } } }
Reprinted with permission from the March 2000 edition of JavaWorld magazine.
Copyright © ITworld.com, Inc., an IDG Communications company.
View the original article at: http://www.javaworld.com/javaworld/javatips/jw-javatip88_p.html
Назад | Содержание | Вперед