Help tips в Swing
Перевод на русский © Сергей Миссан, 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(" ");
}
}
}
Об авторе
Random Walk Computing это наибольшая консалтинговая фирма в Нью Йорке, специализирующаяся на Java/CORBA решениях для предприятий. Известные своим выдающимся знанием Java, консультанты Random Walk публикуются и выступают на самых престижных форумах мира. Для связи с Random Walk используйте
javaqa@javaworld.com.
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
Назад |
Содержание |
Вперед