我需要限制组件(JInternalFrame)在JPanel中的移动 更确切地说:组件只应在用户拖动时沿一个轴移动。
我尝试通过添加组件侦听器并重置位置来实现 每次组件移动时的一个轴。但它“振动” (在拖动过程中快速移动。)
我甚至写了一个自定义布局管理器,它没有帮助!
我猜,问题是:布局管理器和监听器 在组件实际移动后处理移动事件,对吗?
有什么建议吗?
应该(我可以)拦截某些事件,并在交付之前对其进行修改吗?
答案 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
以返回自定义DesktopManager
(DefaultDesktopManager
的扩展名),在dragFrame()
中,您可以测试框架的身份并调整轴。< / p>
修改强>
想一想,你是对的 - 它太复杂了。因为内部框架的UI延伸到DesktopManager
的{{1}},您可以在那里设置它。这是一个poc:
JDesktopPane