2011-10-22 46 views
0

我有3個swing文本字段和一個swing按鈕。我想要做的是將沒有這三個字段爲空的button.setEnabled()從false更改爲true。我想這並不難,但我找不到辦法。 在一個文本字段的keytyped操作上使用button.setEnabled(true)很容易,但是如何檢查所有這些操作? 感謝您的回覆。Java - 用鍵入動作檢查多個JTextFields

回答

0

一個簡單的辦法:無論你會把button.setEnabled(true)放像

button.setEnabled(!tf1.getText().isEmpty() && !tf2.getText().isEmpty() && !tf3.getText().isEmpty()); 
+1

這對一個時間點很有用,但是你仍然想把它附加到某個聽衆,對吧? –

+1

對,所有的'DocumentListener',就像你所做的一樣。對不起,我的回答太簡單了。 –

4

你不想檢查只是鍵盤輸入,只要你想也佔了複製和粘貼輸入去除(停用的JButton)。對於字段的所有三個關聯文檔,我都使用一個DocumentListener,如果所有文檔都包含文本,則將該按鈕設置爲啓用。

例如,

import java.awt.GridLayout; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.text.*; 

public class FieldListenerTest { 
    private static final int FIELD_COUNT = 5; 

    private static void createAndShowUI() { 
     JButton button = new JButton("Button"); 
     FieldListener fieldListener = new FieldListener(button); 
     JPanel mainPanel = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < FIELD_COUNT; i++) { 
     JTextField field = new JTextField(10); 
     fieldListener.registerDoc(field.getDocument()); 
     mainPanel.add(field); 
     } 
     button.setEnabled(false); 
     mainPanel.add(button); 

     JFrame frame = new JFrame("FieldListenerTest"); 
     frame.getContentPane().add(mainPanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 

class FieldListener implements DocumentListener { 
    private List<Document> docs = new ArrayList<Document>(); 
    private JButton button; 

    public FieldListener(JButton button) { 
     this.button = button; 
    } 

    public void registerDoc(Document doc) { 
     docs.add(doc); 
     doc.addDocumentListener(this); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent arg0) { 
     update(); 
    } 

    @Override 
    public void insertUpdate(DocumentEvent arg0) { 
     update(); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent arg0) { 
     update(); 
    } 

    private void update() { 
     for (Document doc : docs) { 
     if (doc.getLength() == 0) { 
      button.setEnabled(false); 
      return; 
     } 
     } 
     button.setEnabled(true); 
    } 

} 
+0

那必須在EDT上完成,只有Listener可以做到這一點,文檔+1 – mKorbel

+1

謝謝。耦合需要減少。 –

2

這是我會怎麼做:

創建一個匿名監聽器檢查字段是否空白並相應地設置按鈕狀態(例如):

 DocumentListener listener = new DocumentListener() { 
     public void changedUpdate(DocumentEvent e) { 
      updateButton(); 
     } 

     public void insertUpdate(DocumentEvent e) { 
      updateButton(); 
     } 

     private void updateButton() { 
      boolean all_blank = tf1.getText().isEmpty() && 
           tf2.getText().isEmpty() && 
           tf3.getText().isEmpty(); 
      button.setEnabled(!all_blank); 
     } 

     public void removeUpdate(DocumentEvent e) { 
      updateButton(); 
     } 
    }; 

然後將其連接到所有的字段:

tf1.getDocument().addDocumentListener(listener); 
tf2.getDocument().addDocumentListener(listener); 
tf3.getDocument().addDocumentListener(listener); 

注:由於Eng.Fouad提到,KeyListener的不貼火了,所以我把它改成一個的DocumentListener

+1

如果您將一些文本粘貼到文本字段中,這將不起作用 –