摆动:当限制其运动时,如何防止组件的闪烁和“振动”?

时间:2009-06-23 16:28:47

标签: java user-interface swing

我需要限制组件(JInternalFrame)在JPanel中的移动 更确切地说:组件只应在用户拖动时沿一个轴移动。

我尝试通过添加组件侦听器并重置位置来实现 每次组件移动时的一个轴。但它“振动” (在拖动过程中快速移动。)

我甚至写了一个自定义布局管理器,它没有帮助!

我猜,问题是:布局管理器和监听器 在组件实际移动后处理移动事件,对吗?

有什么建议吗?

应该(我可以)拦截某些事件,并在交付之前对其进行修改吗?

2 个答案:

答案 0 :(得分:2)

您无需拦截“事件”。一旦Swing处理了鼠标事件,它就会告诉组件移动 - 这就是你可以调整移动值的地方。

move,setLocation和resize都只是setBounds的包装器。在调用super.setBounds()之前,扩展JInternalFrame,覆盖setBounds()方法并忽略x的新值(如果想要水平移动,则忽略y)。

import javax.swing.JInternalFrame;
public class VerticalOnlyFrame extends JInternalFrame {

    public void setBounds(int x, int y, int width, int height) {
            super.setBounds(getBounds().x, y, width, height);
    }

}

这应该解决你的例子,虽然查看JRE代码setBounds()实际上是不推荐使用的reshape()方法的包装器,所以如果你感觉勇敢地重写reshape()而不是。

答案 1 :(得分:1)

您可能想要将您的InternalFrameUI子类化。我在BasicInteralFrameUI.BorderListener.mouseDragged(event)(版本1.129中的第885行)中看到了对getDesktopManager().dragFrame(frame, newX, newY);

的调用

您可以扩展BasicInternalFrameUI以返回自定义DesktopManagerDefaultDesktopManager的扩展名),在dragFrame()中,您可以测试框架的身份并调整轴。< / p>

修改

想一想,你是对的 - 它太复杂了。因为内部框架的UI延伸到DesktopManager的{​​{1}},您可以在那里设置它。这是一个poc:

JDesktopPane