2016-03-26 9 views
-1

DocumentListenersとその他のアクションリスナーについては、読んでいますが、JButtonはテキストフィールドが空の場合はsetEnabled(false)に戻ることができません。これは、キャレットの位置と関係があるか、テキストフィールドのいずれかが空である場合に元の状態に戻す適切な方法です(setEnabled(false))。JTextFieldのドキュメントが空の場合にJButtonの状態を指定する方法

ここまではこれまでに書いたことがあります。

public class home extends javax.swing.JPanel { 
    public home() { 
     JPasswordField currentPasswordJPasswordField; 
     JPasswordField newPasswordJPasswordField; 
     JPasswordField reTypeNewPasswordJPasswordField; 

     currentPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton)); 
     newPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton)); 
     reTypeNewPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton)); 
    } 

    public static class textFieldListener implements DocumentListener { 
     JButton btn; 

     public textFieldListener(JButton button) { 
      btn = button; 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      btn.setEnabled(true); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      btn.setEnabled(true); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      btn.setEnabled(true); 
     } 
    } 
} 

テキストフィールドに何かを入力すると、期待どおりに保存ボタンが有効になります。 しかし、バックスペースを押してすべてのテキストをクリアすると、保存ボタンはsetEnabled(false)に戻りません。

私はすべての応答を感謝したいと思います。私はちょうどこれを学び始めた。別の.javaファイルにアクションリスナーを置くことができるかどうかを知りたい。もしそうなら、どのように私のメインクラスにリスナーを適用することができます。

ありがとうございました。

+0

にそれを任せる[MCVE]または[ショート、自己完結型、正しい例](http://www.sscce.org/)。 –

+0

@AndrewThompson私はそれに留意します。できるだけ簡潔に投稿を編集しました。私はこれが可能な限り短くて簡潔であると思います。ありがとうございました。 – p3ace

+0

「最小」よりもMCVEの方が多く、SSCCEでは「短く」よりも多いことに気付くかもしれません。私があなたに会うためにコードを投稿することを提案しているのは、他の部分です。私たちはコンパイル、実行、そして問題を見てください。* –

答えて

1

各テキストフィールドにKeyListenerを追加し、匿名の内部クラスからボタンを更新することができます。

currentPasswordJPasswordField.addKeyListener(new KeyAdapter() { 
    public void keyReleased(KeyEvent e) { 
     super.keyReleased(e); 
     if(currentPasswordJPasswordField.getText().length() > 0 && 
       newPasswordJPasswordField.getText().length() > 0 && 
       reTypeNewPasswordJPasswordField.getText().length() > 0) { 
      btn.setEnabeld(true); 
     } else { 
      btn.setEnabled(false); 
     } 
    } 
}); 

newPasswordJPasswordField.addKeyListener(new KeyAdapter() { 
    public void keyReleased(KeyEvent e) { 
     super.keyReleased(e); 
     if(currentPasswordJPasswordField.getText().length() > 0 && 
       newPasswordJPasswordField.getText().length() > 0 && 
       reTypeNewPasswordJPasswordField.getText().length() > 0) { 
      btn.setEnabeld(true); 
     } else { 
      btn.setEnabled(false); 
     } 
    } 
}); 

reTypeNewPasswordJPasswordField.addKeyListener(new KeyAdapter() { 
    public void keyReleased(KeyEvent e) { 
     super.keyReleased(e); 
     if(currentPasswordJPasswordField.getText().length() > 0 && 
       newPasswordJPasswordField.getText().length() > 0 && 
       reTypeNewPasswordJPasswordField.getText().length() > 0) { 
      btn.setEnabeld(true); 
     } else { 
      btn.setEnabled(false); 
     } 
    } 
}); 
+0

私はそれを試してみるつもりです。私はキーリスナーがあることを知らなかった。 https://docs.oracle.com/javase/tutorial/uiswing/events/api.htmlのドキュメントも読んでいます。私はそれが動作すればコメントを追加します。それは有り難いです。ありがとう。 – p3ace

+0

はい、これが行く方法です。 –

+2

フィールドにテキストを貼り付けるか、プログラムでフィールドを更新するとどうなりますか? 'KeyListener'はそれらのユースケースを扱うことができません – MadProgrammer

4

あなたの基本的なアプローチはDocumentListenerを使用して、正しいですが、これは本当に簡単な例ですが、までの任意の時点

Documentの内容の長さをチェックしていないようです3つすべてのフィールドに何かがある場合、ボタンは有効になりません。投稿、

あなたはまた、最初の2つのフィールドが一致するかどうかを確認するためにチェックすることでアイデアを拡張することができ、私は早いほど良いのヘルプについてあなた

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.Document; 
import javax.swing.text.JTextComponent; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JPasswordField currentPasswordJPasswordField; 
     private JPasswordField newPasswordJPasswordField; 
     private JPasswordField reTypeNewPasswordJPasswordField;  

     private List<JTextComponent> requiredFields = new ArrayList<>(25); 

     private JButton okay; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.insets = new Insets(2, 2, 2, 2); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      currentPasswordJPasswordField = makePasswordField(); 
      newPasswordJPasswordField = makePasswordField(); 
      reTypeNewPasswordJPasswordField = makePasswordField(); 

      add(currentPasswordJPasswordField, gbc); 
      add(newPasswordJPasswordField, gbc); 
      add(reTypeNewPasswordJPasswordField, gbc); 

      okay = new JButton("Ok"); 
      add(okay); 

      updateState(); 
     } 

     protected JPasswordField makePasswordField() { 
      JPasswordField field = new JPasswordField(20); 
      field.getDocument().addDocumentListener(new DocumentHandler()); 
      requiredFields.add(field); 
      return field; 
     } 

     protected void updateState() { 
      boolean enabled = true; 
      for (JTextComponent field : requiredFields) { 
       if (field.getDocument().getLength() == 0) { 
        enabled = false; 
        break; 
       } 
      } 
      okay.setEnabled(enabled); 
     } 

     public class DocumentHandler implements DocumentListener { 

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       updateState(); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       updateState(); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       updateState(); 
      } 

     } 

    } 

} 
関連する問題