Jtextfield java только цифры

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

Теперь было бы хорошо, если бы фильтр мог на самом деле сказать цепочке, изменил ли он вообще документ, но я оставлю это на ваше усмотрение.

Читайте также:  While несколько раз php

Основная концепция между тем, что вы сделали, и как 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
Источник Поделиться
2012-02-28 06:20

4 ответа

Решение

Вот этот фрагмент кода, вот как вы разрешаете использовать только цифры в JTextField, используя DocumentFilter, как наиболее эффективный способ:

import java.awt.*; import javax.swing.*; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; import javax.swing.text.DocumentFilter.FilterBypass; public class InputInteger < private JTextField tField; private MyDocumentFilter documentFilter; private void displayGUI() < JFrame frame = new JFrame("Input Integer Example"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel contentPane = new JPanel(); contentPane.setBorder( BorderFactory.createEmptyBorder(5, 5, 5, 5)); tField = new JTextField(10); ((AbstractDocument)tField.getDocument()).setDocumentFilter( new MyDocumentFilter()); contentPane.add(tField); frame.setContentPane(contentPane); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); >public static void main(String[] args) < Runnable runnable = new Runnable() < @Override public void run() < new InputInteger().displayGUI(); >>; EventQueue.invokeLater(runnable); > > class MyDocumentFilter extends DocumentFilter < @Override public void insertString(DocumentFilter.FilterBypass fp , int offset, String string, AttributeSet aset) throws BadLocationException < int len = string.length(); boolean isValidInteger = true; for (int i = 0; i < len; i++) < if (!Character.isDigit(string.charAt(i))) < isValidInteger = false; break; >> if (isValidInteger) super.insertString(fp, offset, string, aset); else Toolkit.getDefaultToolkit().beep(); > @Override public void replace(DocumentFilter.FilterBypass fp, int offset , int length, String string, AttributeSet aset) throws BadLocationException < int len = string.length(); boolean isValidInteger = true; for (int i = 0; i < len; i++) < if (!Character.isDigit(string.charAt(i))) < isValidInteger = false; break; >> if (isValidInteger) super.replace(fp, offset, length, string, aset); else Toolkit.getDefaultToolkit().beep(); > > 

Или можно просто использовать этот подход, как указано @Carlos Heuberger

@Override public void insertString(FilterBypass fb, int off , String str, AttributeSet attr) throws BadLocationException < // remove non-digits fb.insertString(off, str.replaceAll("\\D++", ""), attr); >@Override public void replace(FilterBypass fb, int off , int len, String str, AttributeSet attr) throws BadLocationException < // remove non-digits fb.replace(off, len, str.replaceAll("\\D++", ""), attr); >

Источник

Русские Блоги

JTextField может вводить только цифры и десятичные разряды

Поймите, что JTextField может только вводить числа, и контролировать количество знаков после запятой и общую длину чисел

import java.awt.Container; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.math.BigDecimal; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; /** * Можно вводить только цифры * @author */ public class Txtonlynumber < public Txtonlynumber() < JFrame f = new JFrame("Txtonlynumber"); Container contentPane = f.getContentPane(); JTextField salary = new JTextField(50); salary.setDocument(new NumOnlyDocument()); contentPane.add(salary); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() < public void windowClosing(WindowEvent e) < System.exit(0); >>); > public static void main(String[] args) < new Txtonlynumber(); >class NumOnlyDocument extends PlainDocument < private static final long serialVersionUID = 1001689415662878505L; int maxLen; // Самая длинная длина символа int decimalLen; // Количество десятичных знаков public NumOnlyDocument() < this(2,13); >public NumOnlyDocument(int newDecimalLen, int newMaxLen) < super(); decimalLen = newDecimalLen; maxLen = newMaxLen; >public void insertString(int offset, String inStr, AttributeSet attrSet) throws BadLocationException < // Получить действительное значение поля ввода String numStr = getText(0, offset) + inStr + getText(offset, getLength() - offset); System.out.println("inStr===" + inStr + ",offset==" + offset + ",getLength()=" + getLength() + ",value=" + numStr); // Проверка ограничения длины символа if (getLength() + inStr.length() >maxLen) < return; >// Проверить, является ли это действительным числом try < new BigDecimal(numStr); >catch (NumberFormatException e1) < return; >// Проверяем количество десятичных знаков int indexNum = numStr.indexOf("."); if (indexNum > 0) < int len = numStr.substring(indexNum + 1).length(); if (len >decimalLen) < return; >> super.insertString(offset, inStr, attrSet); > > >

Интеллектуальная рекомендация

Groovy Integer тип

Сначала смотрите документацию: Это так же, как Java. Джава Например, определить некоторые целочисленные переменные Есть двоичный восьмеричный 16 в Java, то есть также Groovy. Двоичный литеративный дво.

HDU6390 (линейная заглушка Euler+обратные yuan watch)

Ссылка на заголовок:http://acm.hdu.edu.cn/showproblem.php?pid=6390 Идея: если n-это k времени качества p (то есть n = p^k), φ (n) = p^k-p^(k-1) = (p-1) p^(k-1) Полем Если m, n взаимодействие, &phi.

Сортировка алгоритма

Ниже приведен код, который я понял улучшенную сортировку пузыря после изучения пузырькового порядка (удаление содержимого, связанного с логотипом, является общим пузырем), только для справки Если у ва.

Контраст между добавлением, удалением, удалением, удалением, удалением, удалением и изменением двухэтажного списка цикла и последовательного списка и связанного списка

Название каталога Возьмите лидерство в дополнение к удалению, удалению, расследованию и изменению двухэтажного цикла списка Сравнение последовательных таблиц и связанных списков Возьмите лидерство в д.

Источник

Оцените статью