JTextField: How to limit the number of characters?

Please read the following code.

import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.*; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; public class Bean extends JFrame { private JTextField field1, field2, field3, field4; private JLabel text; private JButton ok, cancel; private JPanel centerPanel,southPanel, textPanel; private GridLayout grid; private FlowLayout flow1, flow2; public Bean() { //Declaring instance Variables field1 = new JTextField(10); field2 = new JTextField(5); field3 = new JTextField(5); field4 = new JTextField(5); text = new JLabel("Insert Your Numbers Here"); AbstractDocument d = (AbstractDocument) field1.getDocument(); d.setDocumentFilter(new Bean.Field1Listener()); ok = new JButton("OK"); cancel = new JButton("Cancel"); /***********************Creating the main view*************************/ centerPanel = new JPanel(); grid = new GridLayout(2,1,1,1); //Adding TextFields textPanel = new JPanel(); flow1 = new FlowLayout(FlowLayout.CENTER); textPanel.setLayout(flow1); textPanel.add(field1); //Adding Buttons southPanel = new JPanel(); southPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); southPanel.add(ok); southPanel.add(cancel); //Creating Center View centerPanel.setLayout(grid); centerPanel.add(text); centerPanel.add(textPanel); //Gathering everything together getContentPane().add(centerPanel,"Center"); getContentPane().add(southPanel,"South"); this.setSize(500,200); this.validate(); this.setVisible(true); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private class Field1Listener extends DocumentFilter { @Override public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { if(fb.getDocument().getLength()+string.length()>5) { return; } fb.insertString(offset, string, attr); } @Override public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException { fb.insertString(offset, "", null); } @Override public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs)throws BadLocationException { if(fb.getDocument().getLength()+text.length()>5) { System.out.println("OK"); return; } fb.insertString(offset, text, attrs); } } public static void main(String[]args) { new Bean(); } } 

Here I am trying to limit the number of characters to 5. OK, it stops inserting more characters when it reaches 5, but the fact is that it also does not allow you to delete inserted characters, replace or anything. Please help me fix this problem. Thanks

+6
source share
2 answers

just change the current delete method:

  @Override public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException { fb.insertString(offset, "", null); } 

for this:

  @Override public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException { fb.remove(offset, length); } 

he should work.

+8
source

You must create your own class that checks to see if you have given more input than the maximum allowed length. See an example http://www.java2s.com/Tutorial/Java/0240__Swing/LimitJTextFieldinputtoamaximumlength.htm .

+5
source

Source: https://habr.com/ru/post/915695/


All Articles