使用鼠标适配器

时间:2015-12-27 07:17:42

标签: java swing listener mouse mousemotionlistener

我正在使用Swing bits库向我的jtable列标题添加过滤器。该库按预期工作,但右键单击列上显示的jpopupmenu不会重新调整大小。 (仅使用鼠标拖动从右下角重新调整尺寸)屏幕截图如下所示。

Swing Bits column filter jpopupmenu

我掌握了摆位库源代码,试图找出这个问题,这就是我找到的。

jpopupmenu调整大小由MouseMotionListner和MouseListener处理。基本上连续调用MouseDragged方法,它应该更新jpopupmenu大小,直到释放鼠标。代码如下所示。

    public void mouseDragged(MouseEvent e) {

    //System.out.println("test_0"); 

    if ( !isResizing ){
    //System.out.println("test_3"); 
    return;}

    Point p = toScreen(e);

    int dx = p.x - mouseStart.x;
    int dy = p.y - mouseStart.y;

    Dimension minDim = menu.getMinimumSize();
    Dimension newDim = new Dimension(startSize.width + dx, startSize.height + dy);

    if ( newDim.width >= minDim.width && newDim.height >= minDim.height) {
        menu.setPopupSize(newDim);
        //System.out.println("test_1");         
    }
    //System.out.println("test_2");
}

通过一些调试,我意识到问题出在menu.setPopUpSize(newDim)方法调用中。

如果没有这段代码,当我尝试重新调整jpopupmenu的大小时,会连续调用mouseDragged()方法。 (应该如此)使用注释的打印语句来计算出来。

包含menu.setPopUpSize(newDim)后,mouseDragged()方法只调用一次。出于某种原因,在调用setPopUpSize方法后,未再次注册鼠标拖动事件。请注意,该方法不会返回。在该单个调用中,setPopUpSize()使用更新的newDim值稍微调整popupmenu的大小。 理想情况下,应该重复调用mouseDragged()方法,直到用户释放鼠标拖动动作,连续重新调整弹出菜单的大小。

我想到的一个方法是公开声明newDim值并在mouseReleased()方法中调用setPopUpSize(newDim)方法。这将从鼠标拖动中获取最终坐标,并使用它来重新调整弹出菜单的大小。但这并没有显示用户的边缘拖动,这非常不方便。

任何帮助都将受到高度赞赏。

不使用setPopUpSize(newDim)方法执行:

test_0
test_1
test_2
test_0
test_1
test_2 ...

重复此模式,直到释放鼠标拖动。

使用setPopUpSize(newDim)方法执行:

test_0
test_1
test_2

mouseDragged()方法只调用一次。

2 个答案:

答案 0 :(得分:1)

根据JPopupMenu使用的布局,可能会发生此行为,有一种方法可以设置父窗口的大小并验证它,以便再次重新计算布局,如下所示:

public class ResizePopup {

    private final static JPopupMenu menu = new JPopupMenu();

    public static void main(final String[] args) {

        final JButton small = new JButton("Small");
        small.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                resize(100, 100);
            }
        });

        final JButton big = new JButton("Big");
        big.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                resize(400, 400);
            }
        });

        menu.add(small);
        menu.add(big);
        menu.show(null, 50, 50);
    }

    private static void resize(final int width, final int height) {
        final Window window = (Window) menu.getTopLevelAncestor();
        window.pack();
        window.setSize(width, height);
        window.validate();
    }
}

答案 1 :(得分:0)

嘛!原来问题是java版本。我正在运行java 1.8.0_25(x64),将其更新到最新版本(1.8.0_66),问题已经消失。图书馆工作正常。有关此问题的更多信息,请访问此处。

https://github.com/eugener/oxbow/issues/44