我正在使用Swing 位库向我的 jtable 列标题添加过滤器。该库按预期工作,但右键单击列上出现的 jpopupmenu 不会重新调整大小。(仅允许使用鼠标拖动从右下角重新调整大小)屏幕截图如下所示。
我获取了 swing bits 库源代码来尝试解决这个问题,这就是我发现的。
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 值稍微重新调整弹出菜单的大小。理想情况下,应该重复调用 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() 方法只被调用一次。