2010-08-30 75 views
1

[這個問題是關於this question]阻止整個揮杆的用戶界面 - 「對話式」

設置:我有這個家制作的「編輯標籤」組件,它看起來像一個標籤,但是當你點擊它時,它會變成一個可編輯的字段,允許你編輯它。您可以按Esc鍵取消,或按住Shift鍵確認編輯 - 或點擊可編輯字段下方的相應按鈕。

挑戰:當你進入這個編輯模式,我希望UI的其餘部分被完全阻斷:您應按能夠做任何事情之前取消或確定的編輯。在寫這篇文章時,我意識到這一點很明顯:這就是對話的運作方式 - 但我喜歡我的「文檔內」編輯標籤,而不是打開對話框。

+0

它只是打我,玻璃窗格和JXLayer可以吸取事件。因此,如果我使用Glass Pane或JXLayer在某個白色層上打出一個可視孔來做出鏈接相關問題所關注的「白板」,我可以簡單地同時不讓事件通過白色部分 - 僅在「衝出「部分.. – stolsvik 2010-08-30 12:32:46

回答

2

玻璃窗格可能是要走的路。您可以輕鬆竊取所有事件並將一些事件發送給您的自定義對象。這裏有一篇文章討論實施A wellbehaved glasspane的方法。

1

這很粗糙。 Swing中沒有方法阻止除一個組件之外的所有UI。這是你必須建立自己的東西。這裏是設計方法,我會用:

  • 建立一個EditableLabelListener接口定義方法editableStateChanged(EditableLabelEvent)

  • 創建一個EditableLabelEvent類擴展AWTEvent並增加了一個editableState財產和isEditable()布爾值。

  • 添加方法添加到自定義組件的addEditableLabelListenerremoveEditableLabelListener

  • 在每個你用你的組件面板中,有你的控制器類(可能是你的面板,這取決於你的設計)實現EditableEventListener並註冊自己作爲組件的監聽者。

  • 當事件被觸發時,控制器類應檢查事件的isEditable方法,並根據需要啓用或禁用面板上的所有其他組件。當同一表單上有多個可編輯的標籤組件時,可以使用事件中的getSource方法來確定正在使用哪一個,以便禁用其他標籤組件。

0

可以擴展JDialog的,那麼當你初始化它,

this.setAlwaysOnTop(true); 
this.setModalityType(ModalityType.APPLICATION_MODAL); 
this.setVisible(false); 
this.setVisible(true); 

這將只允許JDialog的與進行交互,並阻止一切在其他應用程序。

1

在您可編輯的標籤中,當您開始編輯時,請使用SwingUtilities.getRoot()來獲取標籤的根目錄,並將其轉換爲Container。在集裝箱上,您可以撥打getComponents()。遍歷這個數組,除非它是標籤,否則請致電setEnabled(false)。編輯完成後啓用它們。

一個問題:你爲什麼需要它?如果您需要類似對話的行爲,請使用JOptionPane

順便說一句,如果您從JTextField和setOpaque(false)中刪除邊界,它將只是一個可編輯的標籤。

相關問題