Restreindre l'entrée utilisateur à des entiers positifs dans un contrôle JTextField est un problème courant en programmation. Bien que vous ayez essayé d'utiliser un KeyListener à cette fin, il existe une approche plus efficace.
La mise en œuvre d'un DocumentFilter, par opposition à un KeyListener, offre plusieurs avantages :
Pour implémenter cela à l'aide d'un DocumentFilter, considérez ce qui suit exemple :
import javax.swing.text.PlainDocument; import javax.swing.text.DocumentFilter; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; class IntDocumentFilter extends PlainDocument { @Override public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { if (string == null || string.isEmpty()) { super.insertString(fb, offset, string, attr); } else { try { Integer.parseInt(string); super.insertString(fb, offset, string, attr); } catch (NumberFormatException e) { // warn the user and don't allow the insert } } } @Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { if (text == null || text.isEmpty()) { super.replace(fb, offset, length, text, attrs); } else { try { Integer.parseInt(text); super.replace(fb, offset, length, text, attrs); } catch (NumberFormatException e) { // warn the user and don't allow the insert } } } }
Pour utiliser ce filtre, instanciez-le et définissez-le sur l'objet PlainDocument associé au JTextField :
JTextField textField = new JTextField(); PlainDocument doc = (PlainDocument) textField.getDocument(); doc.setDocumentFilter(new IntDocumentFilter());
Cette implémentation :
N'oubliez pas que ces techniques garantissent que l'entrée est conforme aux contraintes souhaitées, vous permettant de contrôler le type de données acceptées par le JTextField.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!