gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:38:55 27 4
gpt4 key购买 nike

我有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com