gpt4 book ai didi

java - 使用鼠标适配器调整 jpopupmenu 的大小

转载 作者:行者123 更新时间:2023-11-30 07:42:18 25 4
gpt4 key购买 nike

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

Swing Bits column filter jpopupmenu

我找到了 swing 位库源代码来尝试解决这个问题,这就是我发现的。

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() 方法仅被调用一次。

最佳答案

这种行为的发生取决于 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();
}
}

关于java - 使用鼠标适配器调整 jpopupmenu 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34478414/

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