简体   繁体   English

如果添加了它的viewport.view MouseListener,则jScrollPane.viewport MouseListener将不起作用

[英]jScrollPane.viewport MouseListener doesn't work if added its viewport.view MouseListener

I have a JScrollPane subclass with this methods. 我有一个使用此方法的JScrollPane子类。

private MouseListener currentViewportMouseListener;
private MouseMotionListener currentViewportMouseMotionListener;
private MouseListener currentScrollableMouseListener;
private MouseMotionListener currentScrollableMouseMotionListener;

@Override
public void setViewportMouseListener(MouseListener mouseListener)
{
    if (currentViewportMouseListener == mouseListener) return;

    viewport.removeMouseListener(currentViewportMouseListener);
    viewport.addMouseListener(mouseListener);
    currentViewportMouseListener = mouseListener;
}

@Override
public void setViewportMouseMotionListener(MouseMotionListener mouseMotionListener)
{
    if (currentViewportMouseMotionListener == mouseMotionListener) return;

    viewport.removeMouseMotionListener(currentViewportMouseMotionListener);
    viewport.addMouseMotionListener(mouseMotionListener);
    currentViewportMouseMotionListener = mouseMotionListener;
}

@Override
public void setScrollableMouseListener(MouseListener mouseListener)
{
    if (currentScrollableMouseListener == mouseListener) return;

    viewport.getView().removeMouseListener(currentScrollableMouseListener);
    viewport.getView().addMouseListener(mouseListener);
    currentScrollableMouseListener = mouseListener;
}

@Override
public void setScrollableMouseMotionListener(MouseMotionListener mouseMotionListener)
{
    if (currentScrollableMouseMotionListener == mouseMotionListener) return;

    viewport.getView().removeMouseMotionListener(currentScrollableMouseMotionListener);
    viewport.getView().addMouseMotionListener(mouseMotionListener);
    currentScrollableMouseMotionListener = mouseMotionListener;
}

So when I use first pair of methods its ok. 因此,当我使用第一对方法时就可以了。

    scrollPane.setViewportMouseListener(mouseListener);
    scrollPane.setViewportMouseMotionListener(mouseListener);

But if I set viewport and view listeners at the same time, viewport Mouse(Motion)Listener does not catch any events. 但是,如果同时设置视口和视图侦听器,则视口Mouse(Motion)Listener不会捕获任何事件。

    scrollPane.setViewportMouseListener(mouseListener);
    scrollPane.setViewportMouseMotionListener(mouseListener);

    scrollPane.setScrollableMouseListener(scrollableMouseListener);
    scrollPane.setScrollableMouseMotionListener(scrollableMouseListener);

And I've checked it out in debugger, both viewport and view listener properties fill correct (different objects). 而且我已经在调试器中将其签出,视口和视图侦听器属性都填充正确(不同的对象)。

public void constructorOrMethodThatCreatesViewport()
{
    // ...
    this.viewport.addMouseListener(mainMouseListener);
    this.viewport.addMouseMotionListener(mainMouseListener);
}

private MouseListener currentViewportMouseListener;
private MouseMotionListener currentViewportMouseMotionListener;
private MouseListener currentScrollableMouseListener;
private MouseMotionListener currentScrollableMouseMotionListener;
private final MyMouseListener mainMouseListener = new MyMouseListener();

private class MyMouseListener implements MouseListener, MouseMotionListener
{
    private MouseEvent viewportToScrollableEvent(MouseEvent event)
    {
        Rectangle viewRect = viewport.getViewRect();
        MouseEvent r = new MouseEvent((Component) event.getSource(), 
                event.getID(), event.getWhen(), event.getModifiers(), 
                event.getX()+viewRect.x, event.getY()+viewRect.y, 
                Math.abs(event.getX()+viewRect.x), 
                Math.abs(event.getY()+viewRect.y), 
                event.getClickCount(), event.isPopupTrigger(), 
                event.getButton());
        return r;
    }

    public void mouseClicked(MouseEvent e)
    {
        if (null != currentScrollableMouseListener)
        {
            currentScrollableMouseListener.mouseClicked(viewportToScrollableEvent(e));
        }
        if (null != currentViewportMouseListener)
        {
            currentViewportMouseListener.mouseClicked(e);
        }
    }

    public void mousePressed(MouseEvent e)
    {
        if (null != currentScrollableMouseListener)
        {
            currentScrollableMouseListener.mousePressed(viewportToScrollableEvent(e));
        }
        if (null != currentViewportMouseListener)
        {
            currentViewportMouseListener.mousePressed(e);
        }
    }

    public void mouseReleased(MouseEvent e)
    {
        if (null != currentScrollableMouseListener)
        {
            currentScrollableMouseListener.mouseReleased(viewportToScrollableEvent(e));
        }
        if (null != currentViewportMouseListener)
        {
            currentViewportMouseListener.mouseReleased(e);
        }
    }

    public void mouseEntered(MouseEvent e)
    {
        if (null != currentScrollableMouseListener)
        {
            currentScrollableMouseListener.mouseEntered(viewportToScrollableEvent(e));
        }
        if (null != currentViewportMouseListener)
        {
            currentViewportMouseListener.mouseEntered(e);
        }
    }

    public void mouseExited(MouseEvent e)
    {
        if (null != currentScrollableMouseListener)
        {
            currentScrollableMouseListener.mouseExited(viewportToScrollableEvent(e));
        }
        if (null != currentViewportMouseListener)
        {
            currentViewportMouseListener.mouseExited(e);
        }
    }

    public void mouseDragged(MouseEvent e)
    {
        if (null != currentScrollableMouseMotionListener)
        {
            currentScrollableMouseMotionListener.mouseDragged(viewportToScrollableEvent(e));
        }
        if (null != currentViewportMouseMotionListener)
        {
            currentViewportMouseMotionListener.mouseDragged(e);
        }
    }

    public void mouseMoved(MouseEvent e)
    {
        if (null != currentScrollableMouseMotionListener)
        {
            currentScrollableMouseMotionListener.mouseMoved(viewportToScrollableEvent(e));
        }
        if (null != currentViewportMouseMotionListener)
        {
            currentViewportMouseMotionListener.mouseMoved(e);
        }
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM