Блокирование и разблокирование пунктов меню

Блокирование и разблокирование пунктов менюБывают случаи, когда некоторые пункты меню должны выбираться лишь в определенных ситуациях. Например, если документ открыт лишь для чтения, то пункт меню Save не имеет смысла. Разумеется, этот пункт можно удалить с помощью JMenu.remove(), но пользователя может удивить постоянно изменяющееся меню. Лучше все же заблокировать пункты меню, временно лишив пользователя возможности выполнять ряд операции.

Чтобы разблокировать или заблокировать пункт меню, используется метод setEnabled():

saveItem.setEnabled(false);

Существуют две стратегии блокирования и разблокирования пунктов меню. При каждом изменении состояния программы можно вызывать метод setEnabled(), применяя его к соответствующему пункту меню. Например, открыв документ только для чтения, можно заблокировать Save и Save as. Однако, пользуясь этой стратегией, программист рискует засорить код фрагментами, предназначенными для изменения состояния пунктов меню. Гораздо лучше совсем не беспокоиться о состоянии пунктов меню в основной части программы и задавать их параметры непосредственно перед отображением на экране.

Для этого нужно зарегистрировать обработчик событий, связанных с выбором меню. В пакете javax.swing.event содержится интерфейс MenuListener, в котором объявлены три метода:

  • void menuSelected(MenuEvent event)
  • void menuDeselected(MenuEvent event)
  • void menuCanceled(MenuEvent event)

Метод menuSelected() вызывается перед отображением меню на экране. Это самый подходящий момент для того, чтобы заблокировать или разблокировать пункты меню. В приведенном ниже фрагменте кода показано, как блокируются и разблокируются пункты пункты Save и Save As, в зависимости от состояния флажка Read Only.

public void menuSelected(MenuEvent event) {
  saveAction.setEnabled(!readonlyItem.isSelected());
  saveAsAction.setEnabled(!readonlyItem.isSelected());
}

Ниже приведен пример программы, генерирующей набор меню. В нем  продемонстрированы все особенности меню, описанные в этом разделе: вложенные меню, заблокированные пункты, флажки опций и переключатели в пунктах меню, а также клавиши быстрого доступа и клавиатурные сокращения.

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.KeyStroke;
import javax.swing.Popup;
import javax.swing.text.DefaultEditorKit.PasteAction;

public class Menu {

/**
* @param args
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
MenuFrame frame = new MenuFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class MenuFrame extends JFrame {
public MenuFrame() {
setTitle("MenuTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

JMenu fileMenu = new JMenu("File");
fileMenu.add(new TestAction("New"));

JMenuItem openItem = fileMenu.add(new TestAction("Open"));
openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));

fileMenu.addSeparator();

saveAction = new TestAction("Save");
JMenuItem saveItem = fileMenu.add(saveAction);
saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));

saveAsAction = new TestAction("Save As");
fileMenu.add(saveAsAction);
fileMenu.addSeparator();

fileMenu.add(new AbstractAction("Exit") {

public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
readonlyItem = new JCheckBoxMenuItem("Read-only");
readonlyItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent event) {
boolean saveOk = !readonlyItem.isSelected();
saveAction.setEnabled(saveOk);
saveAsAction.setEnabled(saveOk);
}
});
ButtonGroup group = new ButtonGroup();

JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");
insertItem.setSelected(true);
JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");

group.add(insertItem);
group.add(overtypeItem);

Action cutAction = new TestAction("Cut");
cutAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));
Action copyAction = new TestAction("Copy");
copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));
Action pasteAction = new TestAction("Paste");
copyAction.putValue(Action.SMALL_ICON, new ImageIcon("paste.gif"));

JMenu editMenu = new JMenu("Edit");
editMenu.add(cutAction);
editMenu.add(copyAction);
editMenu.add(pasteAction);

JMenu optionMenu = new JMenu("Options");

optionMenu.add(readonlyItem);
optionMenu.addSeparator();
optionMenu.add(insertItem);
optionMenu.add(overtypeItem);

editMenu.addSeparator();
editMenu.add(optionMenu);

JMenu helpMenu = new JMenu("Help");
helpMenu.setMnemonic('H');

JMenuItem indexItem = new JMenuItem("Index");
indexItem.setMnemonic('I');
helpMenu.add(indexItem);

Action aboutAction = new TestAction("About");
aboutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));
helpMenu.add(aboutAction);

JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);

menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);

popup = new JPopupMenu();
popup.add(cutAction);
popup.add(copyAction);
popup.add(pasteAction);

JPanel panel = new JPanel();
panel.setComponentPopupMenu(popup);
add(panel);

panel.addMouseListener(new MouseAdapter() {
});
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 300;

private Action saveAction;
private Action saveAsAction;
private JCheckBoxMenuItem readonlyItem;
private JPopupMenu popup;

class TestAction extends AbstractAction {
public TestAction(String name) {
super(name);
}
public void actionPerformed(ActionEvent event) {
System.out.println(getValue(Action.NAME) + " selected.");
}
}
}

Вот что получилось:

Блокирование и разблокирование пунктов меню

Один комментарий на “Блокирование и разблокирование пунктов меню

  1. У меня вот вопрос, вы фреймы текстом все описываете или компоненты готовые на форму кидаете? прост не нашла такой формы с кнопочками закрыть окно открыть развернуть, это какая то готовая форма? и запуская компилироваться, компилирует, но ничего не показывает, (в том коде который компилировать пытаюсь ошибок нет, да и быть не может) чет не доделываю да ^__^?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *