2012-05-23 38 views
1

我們目前在java swing中有一個JTable/JTextEditor焦點問題。 JTable有一個自定義單元格編輯器,它是一個JTextField當輸入無效數據時,防止Java Swing JTable失去焦點

問題是當一個單元格正在編輯並且包含無效數據,並且用戶點擊一個JButton時,文本字段將停止編輯並調用JButton actionPerformed(點擊)。 JTable#setValueAt處理驗證,因此如果JTextField中的數據無效,則底層TableModel不會更新。

理想情況下,我們不希望讓JButton發生點擊。應重點關注JTableJTextField

單擊該按鈕將執行提交操作並關閉表格所在的框架。由於TableModel#setValueAt中的驗證未更新該值,因此它會提交舊值。

可以這樣做嗎?我對Swing還是比較陌生的,所以我不知道要檢查什麼。

不幸的是,我們的代碼並不簡單。 UI是用XML構造的,這樣按鈕就不會知道表單上的其他東西(這是我繼承的代碼)。

在.net中,您可以通過處理驗證事件並設置取消標誌來阻止控件失去焦點。 Java是否有類似的機制?

+0

爲更好地幫助越早編輯與[SSCCE(http://sscce.org/) – mKorbel

+0

你能或許告訴我們按鈕的用途你的問題?爲什麼用戶會點擊它,爲什麼它首先出現?你不能簡單地在鍵入時禁用按鈕嗎?幫助我們理解具體的用例,並且我們可以更準確地幫助您。 – Ewald

+0

乾杯傢伙。稍微修改問題以幫助嘗試繪製圖片。我更習慣於.NET,由於系統的複雜性,我無法真正發佈代碼片段。然而,我會試着用一張桌子和一個按鈕寫一個簡單的方案。 – Andez

回答

0

你可以嘗試在編輯器組件上使用inputverifier,即文本字段嗎?

3

在編輯完成後驗證輸入,在setValueAt()中,可能會遲到不方便。編輯器本身可以排除無效值的導航,如鏈接到相應的tutorial sectionexample所示。

有關有效值,可以使失去焦點時,表提交:

table.putClientProperty("terminateEditOnFocusLost", true); 
+0

您好trashgod,客戶端屬性看起來很有趣,但它們似乎沒有在Java中記錄。並且是組件特定的。你知道每個組件列出這些屬性的好資源嗎?謝謝 – Andez

+0

檢查'CellEditorRemover'附近的'JTable'源。 – trashgod

1

我會通過重寫我JTableCellEditorstopCellEditing方法來實現類似的功能。

@Override 
public boolean stopCellEditing() { 
    String s = (String) getCellEditorValue();  
    if (s != null) {   
     if (!testYourValue()) {   
      Toolkit.getDefaultToolkit().beep();   
      return false; 
     } 
    } 
    return super.stopCellEditing(); 
}