2009-06-23 29 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