我需要限制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