2012-01-05 43 views
3

我有一個表格的問題,據此編輯的單元格不存儲它的新值,直到用戶按下輸入或選項卡,而我希望它一旦失去焦點就提交值,因爲我發現選擇'文件 - >保存',同時編輯一個單元格導致該單元格的數據丟失。 我發現,你可以簡單地設置Java:做文件菜單點擊重點?

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

這對於當選擇文件菜單中,除了重點的每一個變化,在這種情況下,細胞停留在編輯模式下運行良好。 我的問題是,是否設置此屬性的行爲不像人們所期望的那樣,或者默認情況下Java的焦點對於菜單項的工作方式是不同的?

回答

1

如果你看JMenuItem源代碼,有一個函數調用initFocusability()女巫依次調用setFocusable(false)

Java文檔的initFocusability()

Inititalizes的的JMenuItem的可聚焦性。 JMenuItem是可以關注的,但子類可能是, 這提供了他們並調用其他東西,或根本沒有。 請參閱本文的動機 的{@link javax.swing.JMenu#initFocusability}。

Java文檔從JMenu.JMenu#initFocusability

重寫什麼也不做。我們希望JMenu是可以關注的,但JMenuItem 不想成爲,所以我們重寫這個無所事事。在super的構造函數完成之後,我們不調用 setFocusable(true),因爲這具有 的副作用,JMenu將被認爲可以通過我們不需要的 鍵盤進行遍歷。在調用setFocusable(true)後,通過 鍵盤構建一個可穿透的組件是可以的,因爲setFocusable爲 新的API並按照這樣設置,但在內部我們不想使用它 這樣我們改變了鍵盤的可穿透性。

所以這聽起來像你需要撥打setFocusable(true);

+0

嗯,這聽起來挺適合的,但我想它,它似乎沒有不幫幫我。我也嘗試在調用setFocasable之前在我的菜單上調用isFocasable,而且看起來它已經是真的了。 – user1111284 2012-01-06 07:54:50

+1

因爲感覺客廳裏感覺寒冷,所以不要燒牀.-換句話說:通常情況下,用戶界面依賴於菜單/項目,這只是_temporary_ focusOwners。爲了解決未解決的問題,請不要混淆! – kleopatra 2012-01-06 09:54:11

2

如果你不想做的菜單項可聚焦,那麼你將需要添加像你保存操作下面的代碼:

if (table.isEditing()) 
    table.getCellEditor().stopCellEditing(); 
+0

我之前曾嘗試過這種方法,並且得到了一些意想不到的行爲,但我以另一種方式給了它另一種方式,現在似乎可行。如果我不能保證我的桌子只能處理字符串,那很麻煩,但幸運的是它會。我將發佈下面的代碼。 – user1111284 2012-01-06 09:05:13

-1

我發現,上面的兩個答案的組合有解決了這個問題。我有一個可聚焦的菜單欄,並增加了一個DefaultCellEditor與重寫getTableCellEditorComponent方法,增加了一個焦點監聽器停止編輯:

table.setDefaultEditor(String.class, new DefaultCellEditor(new JTextField()){ 
@Override 
public Component getTableCellEditorComponent(JTable table, Object value, 
      boolean isSelected, 
      int row, int column) 
{ 
    Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column); 
    c.addFocusListener(new FocusListener() 
    { 
     public void focusGained(FocusEvent e) 
     { 
     } 
     public void focusLost(FocusEvent e) 
     { 
      stopCellEditing(); 
     } 
    }); 
    return c; 
    } 
}); 
+1

不夠安全 - 編輯組件甚至可能不會將重點放在編輯上。如果組件是一個複合組件(如fi組合框),那麼即使有,監聽器也會失敗。通常,當您想要防止編輯的數據丟失時,依賴焦點事件不是一個好主意:實際焦點轉移周圍的編輯往往是相當不明確的。 – kleopatra 2012-01-06 09:48:40

+0

-1擴展Kleopatra的評論時,編輯器只會雙擊單元格或使用F2來調用編輯器纔會獲得焦點。沒有什麼能阻止用戶在單元格有焦點時輸入文本。在這種情況下,文本會被追加到編輯器中,編輯器無法獲得焦點,因此您的代碼將不會被執行。此外,每次調用編輯器時,此代碼都會將新的FocusListener添加到編輯器組件。 – camickr 2012-01-06 17:06:38

+0

關於編輯多個編輯的問題,我表達了你的觀點 - 這很糟糕。我現在改變了我的代碼,以便我有自己的編輯器來擴展DefaultCellEditor,並在構建時添加一個監聽器。 至於其他問題,他們幾乎使修復冗餘,我想...我試圖編輯單元格只是鍵入而不是正式調用編輯器,它似乎仍然工作正常,但我明白,這幾乎沒有定論和不能代表每個平臺上的每個案例。你能提出一個更可靠的方法,我可以去做這件事嗎? – user1111284 2012-01-09 08:45:16