Creating Custom MenuElement Components: The MenuElement Interface : 自定义菜单 « Swing « Java 教程

En
Java 教程
1. 语言基础
2. 数据类型
3. 操作符
4. 流程控制
5. 类定义
6. 开发相关
7. 反射
8. 正则表达式
9. 集合
10. 线
11. 文件
12. 泛型
13. 本土化
14. Swing
15. Swing事件
16. 二维图形
17. SWT
18. SWT 二维图形
19. 网络
20. 数据库
21. Hibernate
22. JPA
23. JSP
24. JSTL
25. Servlet
26. Web服务SOA
27. EJB3
28. Spring
29. PDF
30. 电子邮件
31. 基于J2ME
32. J2EE应用
33. XML
34. 设计模式
35. 日志
36. 安全
37. Apache工具
38. 蚂蚁编译
39. JUnit单元测试
Java
Java 教程 » Swing » 自定义菜单 
14. 27. 1. Creating Custom MenuElement Components: The MenuElement Interface
public interface MenuElement {
  public Component getComponent();
  public MenuElement[] getSubElements();
  public void menuSelectionChanged(boolean isInclude);
  public void processKeyEvent(KeyEvent event, MenuElement path[], MenuSelectionManager mgr);
  public void processMouseEvent(MouseEvent event, MenuElement path[], MenuSelectionManager mgr);
}
Creating Custom MenuElement Components: The MenuElement Interface
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

import javax.swing.ButtonModel;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JToggleButton;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.event.MouseInputListener;

class JToggleButtonMenuItem extends JToggleButton implements MenuElement {
  Color savedForeground = null;

  private static MenuElement NO_SUB_ELEMENTS[] new MenuElement[0];

  public JToggleButtonMenuItem(String label) {
    super(label);
    init();
  }
  private void init() {
    updateUI();
    setRequestFocusEnabled(false);
    // Borrows heavily from BasicMenuUI
    MouseInputListener mouseInputListener = new MouseInputListener() {
      // If mouse released over this menu item, activate it
      public void mouseReleased(MouseEvent mouseEvent) {
        MenuSelectionManager menuSelectionManager = MenuSelectionManager.defaultManager();
        Point point = mouseEvent.getPoint();
        if ((point.x >= 0&& (point.x < getWidth()) && (point.y >= 0&& (point.y < getHeight())) {
          menuSelectionManager.clearSelectedPath();
          // Component automatically handles "selection" at this point
          // doClick(0); // not necessary
        else {
          menuSelectionManager.processMouseEvent(mouseEvent);
        }
      }

      // If mouse moves over menu item, add to selection path, so it becomes
      // armed
      public void mouseEntered(MouseEvent mouseEvent) {
        MenuSelectionManager menuSelectionManager = MenuSelectionManager.defaultManager();
        menuSelectionManager.setSelectedPath(getPath());
      }

      // When mouse moves away from menu item, disarm it and select something
      // else
      public void mouseExited(MouseEvent mouseEvent) {
        MenuSelectionManager menuSelectionManager = MenuSelectionManager.defaultManager();
        MenuElement path[] = menuSelectionManager.getSelectedPath();
        if (path.length > 1) {
          MenuElement newPath[] new MenuElement[path.length - 1];
          for (int i = 0, c = path.length - 1; i < c; i++) {
            newPath[i= path[i];
          }
          menuSelectionManager.setSelectedPath(newPath);
        }
      }

      // Pass along drag events
      public void mouseDragged(MouseEvent mouseEvent) {
        MenuSelectionManager.defaultManager().processMouseEvent(mouseEvent);
      }

      public void mouseClicked(MouseEvent mouseEvent) {
      }

      public void mousePressed(MouseEvent mouseEvent) {
      }

      public void mouseMoved(MouseEvent mouseEvent) {
      }
    };
    addMouseListener(mouseInputListener);
    addMouseMotionListener(mouseInputListener);
  }

  // MenuElement methods
  public Component getComponent() {
    return this;
  }

  public MenuElement[] getSubElements() {
    // No subelements
    return NO_SUB_ELEMENTS;
  }

  public void menuSelectionChanged(boolean isIncluded) {
    ButtonModel model = getModel();
    // Only change armed state if different
    if (model.isArmed() != isIncluded) {
      model.setArmed(isIncluded);
    }

    if (isIncluded) {
      savedForeground = getForeground();
      if (!savedForeground.equals(Color.BLUE)) {
        setForeground(Color.BLUE);
      else {
        // In case foreground blue, use something different
        setForeground(Color.RED);
      }
    else {
      setForeground(savedForeground);
      // If null, get foreground from installed look and feel
      if (savedForeground == null) {
        updateUI();
      }
    }
  }

  public void processKeyEvent(KeyEvent keyEvent, MenuElement path[], MenuSelectionManager manager) {
    // If user presses space while menu item armed, select it
    if (getModel().isArmed()) {
      int keyChar = keyEvent.getKeyChar();
      if (keyChar == KeyEvent.VK_SPACE) {
        manager.clearSelectedPath();
        System.out.println("Selected: JToggleButtonMenuItem, by KeyEvent");
        doClick(0)// inherited from AbstractButton
      }
    }
  }

  public void processMouseEvent(MouseEvent mouseEvent, MenuElement path[],
      MenuSelectionManager manager) {
    // For when mouse dragged over menu and button released
    if (mouseEvent.getID() == MouseEvent.MOUSE_RELEASED) {
      manager.clearSelectedPath();
      System.out.println("Selected: JToggleButtonMenuItem, by MouseEvent");
      doClick(0)// inherited from AbstractButton
    }
  }

  // Borrows heavily from BasicMenuItemUI.getPath()
  private MenuElement[] getPath() {
    MenuSelectionManager menuSelectionManager = MenuSelectionManager.defaultManager();
    MenuElement oldPath[] = menuSelectionManager.getSelectedPath();
    MenuElement newPath[];
    int oldPathLength = oldPath.length;
    if (oldPathLength == 0)
      return new MenuElement[0];
    Component parent = getParent();
    if (oldPath[oldPathLength - 1].getComponent() == parent) {
      // Going deeper under the parent menu
      newPath = new MenuElement[oldPathLength + 1];
      System.arraycopy(oldPath, 0, newPath, 0, oldPathLength);
      newPath[oldPathLengththis;
    else {
      // Sibling/child menu item currently selected
      int newPathPosition;
      for (newPathPosition = oldPath.length - 1; newPathPosition >= 0; newPathPosition--) {
        if (oldPath[newPathPosition].getComponent() == parent) {
          break;
        }
      }
      newPath = new MenuElement[newPathPosition + 2];
      System.arraycopy(oldPath, 0, newPath, 0, newPathPosition + 1);
      newPath[newPathPosition + 1this;
    }
    return newPath;
  }
}



public class JToggleButtonMenuItemDemo {
  public static void main(final String args[]) {
    JFrame frame = new JFrame("MenuSample Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JMenuBar menuBar = new JMenuBar();

    // File Menu, F - Mnemonic
    JMenu fileMenu = new JMenu("File");
    fileMenu.setMnemonic(KeyEvent.VK_F);
    menuBar.add(fileMenu);


    // File->New, N - Mnemonic
    JToggleButtonMenuItem newMenuItem = new JToggleButtonMenuItem("New");
    fileMenu.add(newMenuItem);

    frame.setJMenuBar(menuBar);
    frame.setSize(350250);
    frame.setVisible(true);
  }
}
14. 27. 自定义菜单
14. 27. 1. Creating Custom MenuElement Components: The MenuElement InterfaceCreating Custom MenuElement Components: The MenuElement Interface
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.