2014-11-06 56 views
0

我開發了一個圖形界面,由12 JPanels組成,每個包含4到10個JTextFields。 我想實現一個未保存更改警告以防用戶更改了某些JTextFields的內容但未提交對數據庫的更改擺動監視器未保存的更改

如何實現這一目標? 我的第一個想法是使用ItemListener並註冊所有JTextFields。我可以爲每個面板存儲變量布爾unsavedChanges並檢查所有面板是否爲假。

你能想象別的更有效的解決方案嗎?

+2

你可以使用[的DocumentListener(http://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html)代替,並將其添加到[JTextField.getDocument結果() ](http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#getDocument%28%29)。 – predi 2014-11-06 12:56:22

回答

3

您有兩種選擇。

  1. 您可以在每個JTextField的文檔上註冊DocumentListener。

    textField.getDocument().addDocumentListener(documentListener)

    缺點:文本字段被標記爲改變,即使用戶已經改變了價值爲原始值。要處理這個問題,您可以將原始值保存在您自己的文檔偵聽器中,並將新值與它進行比較。 hasChanged()方法爲您提供了所需的信息。

    import javax.swing.event.*; 
    import javax.swing.text.*; 
    
    public class DocumentChangeListener implements DocumentListener { 
    
        private boolean changed; 
        private final String originalValue; 
    
        public DocumentChangeListener(String originalValue) { 
         this.originalValue = originalValue; 
        } 
    
        protected void changed(DocumentEvent e) { 
         if (e.getDocument() instanceof PlainDocument) { 
          PlainDocument doc = ((PlainDocument)e.getDocument()); 
          try { 
           String value = doc.getText(0, doc.getLength()); 
           changed = originalValue == null || !originalValue.equals(value); 
          } catch(BadLocationException exc) { 
           exc.printStackTrace(); 
          } 
         } 
        } 
    
        public void changedUpdate(DocumentEvent e) { 
         changed(e); 
        } 
    
        public boolean hasChanged() { 
         return this.changed; 
        } 
    
        public void insertUpdate(DocumentEvent e) { 
         changed(e); 
        } 
    
        public void removeUpdate(DocumentEvent e) { 
         changed(e); 
        } 
    } 
    
  2. ,你從地圖或類似這樣的東西數據庫讓他們可以爲您節省在文本字段中顯示的原始值。當您檢查面板時,您必須將文本字段的內容與原始值進行比較。

編輯

收集每一個文本字段的變化信息,您可以使用類這樣的。你在你的框架中創建它的一個實例,並將其傳遞給所有面板。

import java.util.*; 
import javax.swing.text.*; 

public class ChangeManager { 

    private final Collection<DocumentChangeListener> listeners; 

    public ChangeManager() { 
     listeners = new HashSet<>(); 
    } 

    public boolean hasChanged() { 
     for(DocumentChangeListener listener : listeners) { 
      if(listener.hasChanged()) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public void register(JTextComponent textComponent, String originalValue) { 
     DocumentChangeListener listener = new DocumentChangeListener(
       originalValue); 
     textComponent.getDocument().addDocumentListener(listener); 
     listeners.add(listener); 
    } 
} 
+0

感謝您的全面回答。我仍然不確定如何通過一堆Jpanel直到MainClass JFrame傳遞更改的信息。 – user3703592 2014-11-07 15:22:56