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

Назад | Содержание | Вперед