- JTextField, ограничивающий ввод количества символов и принимающий только цифры
- Как можно ограничить ввод символов в JTextField? — Java
- Код к задаче: «Как можно ограничить ввод символов в JTextField?»
- Как разрешить вводить только цифры в jTextField?
- Или можно просто использовать этот подход, как указано @Carlos Heuberger
- Русские Блоги
- JTextField может вводить только цифры и десятичные разряды
- Интеллектуальная рекомендация
- Groovy Integer тип
- HDU6390 (линейная заглушка Euler+обратные yuan watch)
- Сортировка алгоритма
- Контраст между добавлением, удалением, удалением, удалением, удалением, удалением и изменением двухэтажного списка цикла и последовательного списка и связанного списка
JTextField, ограничивающий ввод количества символов и принимающий только цифры
Вы на правильном пути, за исключением того, что вы захотите использовать DocumentFilter вместо реализации своего собственного документа.
В блоге MDP есть множество отличных примеров (включая ограничение длины и типа символов).
Теперь на ваш вопрос, вы можете создать каскадный фильтр, где вы можете объединить несколько фильтров в цепочку.
Это позволит вам вызывать каждый фильтр по очереди.
public class ChainableFilter extends DocumentFilter < private Listfilters; private AttributeSet attr; public ChainableFilter() < filters = new ArrayList(25); > public void addFilter(DocumentFilter filter) < filters.add(filter); >public void removeFilter(DocumentFilter filter) < filters.remove(filter); >public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException < for (DocumentFilter filter : filters) < filter.insertString(fb, offset, string, attr); >> public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException < for (DocumentFilter filter : filters) < filter.remove(fb, offset, length); >> public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException < for (DocumentFilter filter : filters) < filter.replace(fb, offset, length, text, attrs); >> >
Теперь было бы хорошо, если бы фильтр мог на самом деле сказать цепочке, изменил ли он вообще документ, но я оставлю это на ваше усмотрение.
Основная концепция между тем, что вы сделали, и как DocumentFilters работа почти такая же. Преимущество в том, что вы не ограничиваете себя PlainDocument Вы можете, теоретически, применить его к JTextPane или же JEditorPane ,
Основная идея цепочки фильтров проста.
ChainableFilter chainableFilter = new ChainableFilter(); chainableFilter.addFilter(new RestrictedLengthFilter()); // User supplied filter chainableFilter.addFilter(new NumericFilter()); // User supplied filter ((AbstractDocument)textField.getDocument()).setDocumentFilter(chainableFilter);
Что касается фактических фильтров, я бы проверил ссылку, которую я разместил ранее. Вы на правильном пути со своими идеями, хотя
SizeFilter sizeFilter = new SizeFilter(12); NumberFilter numFilter = new NumberFilter(); ChainableFilter chainFilter = new ChainableFilter(); chainFilter.addFilter(sizeFilter); chainFilter.addFilter(numFilter); JTextField field = new JTextField(); ((AbstractDocument) field.getDocument()).setDocumentFilter(chainFilter); public class NumberFilter extends DocumentFilter < private int decimalPrecision = 2; private boolean allowNegative = false; public NumberFilter() < >public NumberFilter(int decimals, boolean negatives) < decimalPrecision = decimals; allowNegative = negatives; >protected boolean accept(FilterBypass fb, int offset, String str) throws BadLocationException < boolean accept = true; int length = fb.getDocument().getLength(); String currentText = fb.getDocument().getText(0, length); if (str != null) < if (!isNumeric(str) && !str.equals(".") && !str.equals("-")) < //First, is it a valid character? Toolkit.getDefaultToolkit().beep(); accept = false; >else if (str.equals(".") && currentText.contains(".")) < //Next, can we place a decimal here? Toolkit.getDefaultToolkit().beep(); accept = false; >else if (isNumeric(str) && currentText.indexOf(",") != -1 && offset > currentText.indexOf(",") && length - currentText.indexOf(".") > decimalPrecision && decimalPrecision > 0) < //Next, do we get past the decimal precision limit? Toolkit.getDefaultToolkit().beep(); accept = false; >else if (str.equals("-") && (offset != 0 || !allowNegative)) < //Next, can we put a negative sign? Toolkit.getDefaultToolkit().beep(); accept = false; >> return accept; > @Override public void insertString(FilterBypass fb, int offset, String str, AttributeSet as) throws BadLocationException < if (accept(fb, offset, str)) < super.insertString(fb, offset, str, as); >> @Override public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException < if (accept(fb, offset, text)) < super.replace(fb, offset, length, text, attrs); >> public boolean isNumeric(String str) < try < int x = Integer.parseInt(str); System.out.println(x); return true; >catch (NumberFormatException nFE) < System.out.println("Not an Integer"); return false; >> > public class SizeFilter extends DocumentFilter < private int maxCharacters; public SizeFilter(int maxChars) < maxCharacters = maxChars; >public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException < if ((fb.getDocument().getLength() + str.length()) else < Toolkit.getDefaultToolkit().beep(); >> public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException < if ((fb.getDocument().getLength() + str.length() - length) else < Toolkit.getDefaultToolkit().beep(); >> >
Опять же, я знаю, что он компилируется, но я не проверял его (в частности, числовой фильтр), но это было бы хорошим упражнением в отладке;)
Как можно ограничить ввод символов в JTextField? — Java
Добрый день! Подскажите, как можно ограничить ввод символов в JTextField, чтобы вводились только цифры и «.», а остальные символы даже не выводились бы в TextField.
Код к задаче: «Как можно ограничить ввод символов в JTextField?»
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.*; public class Test extends JFrame < public Test() < final JLabel label = new JLabel(); final JTextField tf1 = new JTextField (); JButton button = new JButton("Очистить"); getContentPane().add (tf1, BorderLayout.NORTH); label.setForeground(Color.red); label.setFont(new Font("Consolas",Font.PLAIN,16)); add(label,BorderLayout.SOUTH); add(button,BorderLayout.EAST); tf1.addKeyListener(new KeyAdapter() < @Override public void keyPressed(KeyEvent e) < Pattern p = Pattern.compile("((5)([\\.]))+"); Matcher m = p.matcher(tf1.getText()); if(!m.matches()) < tf1.setEnabled(false); label.setText("Нажмите на кнопку \"Очистить\" Вводите только цифры и символ \".\""); >> >); button.addActionListener(new ActionListener() < @Override public void actionPerformed(ActionEvent e) < tf1.setText(""); tf1.setEnabled(true); >>); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setSize(640,340); > public static void main(String[] args) < Frame f = new Test(); f.setVisible(true); >>
Как разрешить вводить только цифры в jTextField?
Вот почему я пытаюсь использовать другой метод, позволяющий использовать только цифры:
txtUsername.addKeyListener(new MyKeyListener()); public class MyKeyListener extends KeyAdapter < public void keyPressed(KeyEvent ke)< System.out.println("Key pressed code q-info"> 12 java swing jtextfield digits restriction Источник Поделиться user282887 28 фев '12 в 06:20 2012-02-28 06:20