2009-06-23 44 views
1

我需要限制JPanel内部组件(JInternalFrame)的移动。
更确切地说:一个组件只能在用户拖动时沿着一个轴移动。摆动:如何限制组件的闪烁和“振动”,限制组件的移动?

我试图通过添加组件侦听这样做,并重置位置的一个轴线的每次组件移动的 。但它“震动” (在拖动期间快速移动)。

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

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

有什么建议吗?

应(我能)拦截一些事件,并对其进行修改,它的交付之前?

回答

1
你可能想

子类你的InternalFrameUI。我看到BasicInteralFrameUI.BorderListener.mouseDragged(event)(线885在1.129版本)来getDesktopManager().dragFrame(frame, newX, newY);

一个电话你可以扩展BasicInternalFrameUI返回一个自定义的DesktopManager(的DefaultDesktopManager扩展名),其中dragFrame()您测试框架的身份和调整轴。

编辑:

想着它,你是对的 - 实在是太复杂。作为内部框架的UI推迟到JDesktopPaneDesktopManager,你可以在此设置。这里是一个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); 
} 
+0

完美的作品! – 2009-06-24 16:14:03

2

你没有需要拦截的“事件”。一旦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()实际上是一个包装到弃用重塑()方法,因此,如果你感觉勇敢覆盖重塑()代替。

+0

谢谢。这听起来不错。我在考虑拦截事件的原因是能够为任何组件进行预期对齐。 – 2009-06-24 09:09:28