[JAVA-GUI]Swing里JPopMenu中JMenuItem的点击事件

来源:互联网 发布:网络视频格式有哪些 编辑:程序博客网 时间:2024/06/06 04:55

应该注意到,在为JMenuItem绑定MousetListener后,mouseClicked事件并不能被触发。那么:


>如何在JPopMenu中对检测点击事件

private JPopupMenu myPopMenu(){JPopupMenu jPopupMenu = new JPopupMenu();JMenuItem jMenuItem = new JMenuItem();jMenuItem.setText("退出");jMenuItem.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {//只能检测到mousePressed事件super.mouseClicked(e);System.exit(0);}});jPopupMenu.add(jMenuItem);return jPopupMenu;}

若要实现右键弹出一个菜单,在Swing容器中加上以下内容即可:

//右键弹出退出菜单JPopupMenu jPopupMenu = myPopMenu();//鼠标监听器jLabel.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);if(e.isMetaDown()){if(e.getButton() == MouseEvent.BUTTON3){jPopupMenu.show(me, e.getX(), e.getY());}}}});


>为何无法检测到mouseClicked?

在JMenuItem中有个内部类:

protected class AccessibleJMenuItem extends AccessibleAbstractButton implements ChangeListener {        private boolean isArmed = false;        private boolean hasFocus = false;        private boolean isPressed = false;        private boolean isSelected = false;        AccessibleJMenuItem() {            super();            JMenuItem.this.addChangeListener(this);        }        /**         * Get the role of this object.         *         * @return an instance of AccessibleRole describing the role of the         * object         */        public AccessibleRole getAccessibleRole() {            return AccessibleRole.MENU_ITEM;        }        private void fireAccessibilityFocusedEvent(JMenuItem toCheck) {            MenuElement [] path =                MenuSelectionManager.defaultManager().getSelectedPath();            if (path.length > 0) {                Object menuItem = path[path.length - 1];                if (toCheck == menuItem) {                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        null, AccessibleState.FOCUSED);                }            }        }        /**         * Supports the change listener interface and fires property changes.         */        public void stateChanged(ChangeEvent e) {            firePropertyChange(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY,                               Boolean.valueOf(false), Boolean.valueOf(true));            if (JMenuItem.this.getModel().isArmed()) {                if (!isArmed) {                    isArmed = true;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        null, AccessibleState.ARMED);                    // Fix for 4848220 moved here to avoid major memory leak                    // Here we will fire the event in case of JMenuItem                    // See bug 4910323 for details [zav]                    fireAccessibilityFocusedEvent(JMenuItem.this);                }            } else {                if (isArmed) {                    isArmed = false;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        AccessibleState.ARMED, null);                }            }            if (JMenuItem.this.isFocusOwner()) {                if (!hasFocus) {                    hasFocus = true;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        null, AccessibleState.FOCUSED);                }            } else {                if (hasFocus) {                    hasFocus = false;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        AccessibleState.FOCUSED, null);                }            }            if (JMenuItem.this.getModel().isPressed()) {                if (!isPressed) {                    isPressed = true;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        null, AccessibleState.PRESSED);                }            } else {                if (isPressed) {                    isPressed = false;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        AccessibleState.PRESSED, null);                }            }            if (JMenuItem.this.getModel().isSelected()) {                if (!isSelected) {                    isSelected = true;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        null, AccessibleState.CHECKED);                    // Fix for 4848220 moved here to avoid major memory leak                    // Here we will fire the event in case of JMenu                    // See bug 4910323 for details [zav]                    fireAccessibilityFocusedEvent(JMenuItem.this);                }            } else {                if (isSelected) {                    isSelected = false;                    firePropertyChange(                        AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                        AccessibleState.CHECKED, null);                }            }        }    } // inner class AccessibleJMenuItem
大概是这个原因?

原创粉丝点击