我需要限制JPanel内部组件(JInternalFrame)的移动。
更确切地说:一个组件只能在用户拖动时沿着一个轴移动。摆动:如何限制组件的闪烁和“振动”,限制组件的移动?
我试图通过添加组件侦听这样做,并重置位置的一个轴线的每次组件移动的 。但它“震动” (在拖动期间快速移动)。
我甚至写了一个自定义布局管理器,它并没有帮助一点点!
我想问题是:布局管理器和监听器 处理组件实际移动后的移动事件,对吧?
有什么建议吗?
应(我能)拦截一些事件,并对其进行修改,它的交付之前?
我需要限制JPanel内部组件(JInternalFrame)的移动。
更确切地说:一个组件只能在用户拖动时沿着一个轴移动。摆动:如何限制组件的闪烁和“振动”,限制组件的移动?
我试图通过添加组件侦听这样做,并重置位置的一个轴线的每次组件移动的 。但它“震动” (在拖动期间快速移动)。
我甚至写了一个自定义布局管理器,它并没有帮助一点点!
我想问题是:布局管理器和监听器 处理组件实际移动后的移动事件,对吧?
有什么建议吗?
应(我能)拦截一些事件,并对其进行修改,它的交付之前?
子类你的InternalFrameUI。我看到BasicInteralFrameUI.BorderListener.mouseDragged(event)
(线885在1.129版本)来getDesktopManager().dragFrame(frame, newX, newY);
一个电话你可以扩展BasicInternalFrameUI
返回一个自定义的DesktopManager
(的DefaultDesktopManager
扩展名),其中dragFrame()
您测试框架的身份和调整轴。
编辑:
想着它,你是对的 - 实在是太复杂。作为内部框架的UI推迟到JDesktopPane
的DesktopManager
,你可以在此设置。这里是一个poc:
public Demo() {
JFrame frame = new JFrame();
frame.setSize(300,300);
JDesktopPane df = new JDesktopPane();
DesktopManager dm = df.getDesktopManager();
df.setDesktopManager(new DefaultDesktopManager(){
public void dragFrame(JComponent f, int newX, int newY) {
super.dragFrame(f, newX, 5);
}
});
JInternalFrame jif = new JInternalFrame("test ");
jif.setLocation(5, 5);
jif.setSize(150,100);
jif.setVisible(true);
df.add(jif);
frame.setContentPane(df);
frame.setVisible(true);
}
你没有需要拦截的“事件”。一旦Swing处理鼠标事件,它会告诉组件移动 - 这就是您可以调整移动值的位置。
举动,setLocation和调整都只是包装器的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()实际上是一个包装到弃用重塑()方法,因此,如果你感觉勇敢覆盖重塑()代替。
谢谢。这听起来不错。我在考虑拦截事件的原因是能够为任何组件进行预期对齐。 – 2009-06-24 09:09:28
完美的作品! – 2009-06-24 16:14:03