我有一个 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)(例如 MouseListener
、MouseMotionListener
等)。
您必须使用多种方法添加它,例如如果您希望调用 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/