java - JMenuBar 上的 MouseInputAdapter - 并非所有方法都会被调用

标签 java swing mouseevent

我有一个 JComponent ,其中包含 JMenuBar 。我希望能够通过单击组件并将鼠标拖动到所需位置来拖动组件。我已经通过将 MouseInputAdapter 方法添加到其 Border 来实现此功能,并且效果很好。

但是,我想在 JMenuBar 上应用相同的功能,但 mouseDragged() 方法不会被调用。

这是菜单监听器(用于测试的剥离版本):

menuBar.addMouseListener(new MouseInputAdapter() {

            private Point startPos = null;

            @Override
            public void mousePressed(MouseEvent me) {

                startPos = me.getPoint();
                // works fine
                System.out.println("startPos: " + startPos.toString());
            }

            @Override
            public void mouseDragged(MouseEvent me) {
                // this does not get called...
                System.out.println("dragging.............");
            }

 });

我不认为这是问题所在,但这是用于整个组件的监听器。这两个听众会以某种方式发生碰撞吗?我尝试删除这个监听器,但它没有解决任何问题:

// this works with the border
this.addMouseListener(resizeListener);

MouseInputListener resizeListener = new MouseInputAdapter() {
        @Override
        public void mouseEntered(MouseEvent me) {
            // put this widget on top when mouse moves across it
            putOnTop();
        }

        @Override
        public void mouseMoved(MouseEvent me) {
            // put this widget on top when mouse moves across it
            putOnTop();
            WidgetBorder border = (WidgetBorder) getBorder();
            setCursor(Cursor.getPredefinedCursor(border.getResizeCursor(me)));
        }

        @Override
        public void mouseExited(MouseEvent mouseEvent) {
            setCursor(Cursor.getDefaultCursor());
        }

        private int cursor;
        private Point startPos = null;

        @Override
        public void mousePressed(MouseEvent me) {

            WidgetBorder border = (WidgetBorder) getBorder();
            cursor = border.getResizeCursor(me);

            startPos = me.getPoint();
        }

        @Override
        public void mouseDragged(MouseEvent me) {
            if (startPos != null) {

                // widget cant be resized under its minimum size
                if (widget.getWidth() < WidgetConstants.MIN_WIDTH) {
                    widget.setBounds(widget.getX(), widget.getY(), WidgetConstants.MIN_WIDTH + 1, widget.getHeight());
                    return;
                }
                if (widget.getHeight() < WidgetConstants.MIN_HEIGHT) {
                    widget.setBounds(widget.getX(), widget.getY(), widget.getWidth(), WidgetConstants.MIN_HEIGHT + 1);
                    return;
                }

                int dx = me.getX() - startPos.x;
                int dy = me.getY() - startPos.y;
                switch (cursor) {
                    case Cursor.SE_RESIZE_CURSOR:
                        setBounds(getX(), getY(), getWidth() + dx, getHeight() + dy);
                        startPos = me.getPoint();
                        repaintParent();
                        break;
                    case Cursor.MOVE_CURSOR:
                        Rectangle bounds = getBounds();
                        bounds.translate(dx, dy);
                        setBounds(bounds);
                        repaintParent();
                }

                // cursor shouldn't change while dragging 
                setCursor(Cursor.getPredefinedCursor(cursor));
            }
        }

        @Override
        public void mouseReleased(MouseEvent mouseEvent) {
            startPos = null;
        }
    };

我在这里缺少什么?感谢您的帮助...

最佳答案

MouseInputAdapter 实现了许多接口(interface)(例如 MouseListenerMouseMotionListener 等)。

您必须使用多种方法添加它,例如如果您希望调用 mouseClicked(),则使用 Component.addMouseListener();如果您希望调用 mouseDragged(,则使用 Component.addMouseMotionListener()) ) 被调用,Component.addWheelListener() 如果您想要 mouseWheelMoved() 被调用。

当然,您可以传递相同的引用,但您必须使用多种方法添加监听器实现。原因是因为例如 Component.addMouseListener() 需要一个 MouseListener 接口(interface),并且只会调用 MouseListener 接口(interface)中定义的方法,即使如果您传递一个实现其他接口(interface)的其他方法的对象。

关于java - JMenuBar 上的 MouseInputAdapter - 并非所有方法都会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24692804/

相关文章:

java - SWTBot 拖动鼠标

java - Android 图形 API

java - 强制某人仅使用工厂来创建对象

java - 如何将 yml 对象绑定(bind)到声明为该对象实现的接口(interface)的字段?

java - 如何从命令行显示 Java keystore SecretKeyEntry

java - JFrame 显示为空

java - 在java应用程序中交换鼠标按钮

java - 所有按钮均不显示

java - 使用 GWT 的 FlexTable 的鼠标悬停

Javascript 事件监听器 - 在事件完成冒泡后运行代码