2016-03-26 4 views
-1

Итак, я только начал читать о DocumentListeners и некоторых других прослушивателях событий сегодня, но я не могу получить свой JButton, чтобы вернуться к setEnabled(false), если любое из текстовых полей пуст. Это как-то связано с позицией каретки или есть правильный способ вернуть ее в исходное состояние setEnabled(false), когда любое текстовое поле пуст.Как указать состояние JButton, если документ JTextField пуст

Вот что я написал до сих пор.

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); 
     } 
    } 
} 

Когда я набираю что-то на текстовое поле, он позволяет кнопку сохранения, как ожидалось. Но когда я нажимаю backspace, чтобы очистить весь текст, кнопка сохранения не вернется кsetEnabled(false).

Буду признателен за любой ответ. Я только начал изучать это. Я также хочу знать, могу ли я поместить прослушиватели действий в отдельный .java-файл. Если да, то как я могу применить слушателей к моему основному классу.

Спасибо.

+0

Для лучшей помощи рано, оставить [MCVE] или [Short, Самостоятельный, правильный пример] (http://www.sscce.org/). –

+0

@AndrewThompson Я это сделаю. Я отредактировал свой пост как можно более краткий. Я предполагаю, что это самый короткий и самый краткий. Спасибо. – p3ace

+0

Возможно, вы заметили, что в MCVE больше, чем в «Минимальном», больше для SSCCE, чем «Short». Это другие части, которые я предлагаю вам почтовый код для встречи. Почтовый код, который мы можем скомпилировать, запустить и * увидеть проблему. * –

ответ

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 «s в любой точке

Это очень простой пример, но до тех пор, все три поля имеют что-то в них, кнопка не будет включена.

Вы можете расширить эту идею также проверять, если совпадают первые два поля, но я оставлю это до вас

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(); 
      } 

     } 

    } 

} 
Смежные вопросы