Как получить текст из текстового поля фильтра документов

Я следовал этому примеру, чтобы разрешить ввод только чисел. jTextField?

но теперь это не позволит мне использовать textField.getText(); нужно ли мне вызывать другой метод, чтобы получить текст после использования фильтра документов?

также это должно быть просто JTextField? форматированное текстовое поле плохо?

РЕДАКТИРОВАТЬ:

package inputinteger;

import java.awt.*;
import java.awt.event.KeyEvent;
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 JLabel label=new JLabel();
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());
    tField.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            tFieldKeyPressed(evt);
        }
    });
    contentPane.add(tField); 
    contentPane.add(label);


    frame.setContentPane(contentPane);
    frame.pack();
    frame.setLocationByPlatform(true);
    frame.setVisible(true);
}
private void tFieldKeyPressed(java.awt.event.KeyEvent evt) {
    label.setText(tField.getText());
}
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(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);
}
}

Таким образом, этот код работает нормально, но в программе, которую я создаю, я использую конструктор графического интерфейса пользователя NetBeans и имею JFormattedTextField, который я хочу принимать только числа в качестве входных данных. Я попытался добавить код создания сообщения, и, похоже, он сработал, но теперь он выдает ошибку, что не может найти JFormattedTextField (в моем случае CreditInput)

Это может быть что-то очень простое, что я слишком устал, чтобы видеть прямо сейчас. Утром буду копать глубже. Если кто-нибудь увидит мою проблему, я буду признателен за любой вклад!

РЕДАКТИРОВАТЬ 2: это код, который у меня есть в NetBeans

    javax.swing.JFormattedTextField creditsInput = new javax.swing.JFormattedTextField();
    ((AbstractDocument)creditsInput.getDocument()).setDocumentFilter(new MyDocumentFilter());

Далее в коде...

creditsInput.getText();//THIS LINE SAYS Symbol creditsInput cannot be found in class \

также я не могу вводить буквы в текстовое поле, так что эта часть работает, мне просто нужно иметь возможность получить значение того, что введено сейчас.


person Nick Bolles    schedule 27.01.2014    source источник
comment
Нет, просто вызовите getText. Он вернет строку, но фильтр предотвратит попадание любых символов, которые вам не нужны, в базовый документ и, следовательно, в текстовое поле. Какие ошибки вы получаете? Можете ли вы опубликовать работающий пример, демонстрирующий вашу проблему?   -  person MadProgrammer    schedule 27.01.2014
comment
Обновил мой вопрос с примером того, что я делаю. Проблема в том, что это работает в моем примере... Подробнее в разделе редактирования моего вопроса   -  person Nick Bolles    schedule 27.01.2014
comment
теперь он выдает ошибку, что не может найти JFormattedTextField (в моем случае creditInput) - Где именно вводится creditInput в коде? Я этого не вижу.   -  person Paul Samsotha    schedule 27.01.2014
comment
фу. Прости, что я устал, когда писал это. Я отредактирую вопрос, чтобы он был более применим к моей проблеме.   -  person Nick Bolles    schedule 27.01.2014


Ответы (1)


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

person Nick Bolles    schedule 27.01.2014
comment
Рассмотрите возможность использования JSpinner, как показано здесь. - person Andrew Thompson; 28.01.2014
comment
Я сказал, что заставил его работать. Хотя JSpinner может быть другой возможностью. - person Nick Bolles; 28.01.2014
comment
Да, я это читал. Просто JSpinner в целом лучшая альтернатива с точки зрения пользователя. Например, могу ли я, как пользователь, использовать клавиши со стрелками вверх/вниз для выбора числа? Если бы не это, это бы меня отрубило. Спиннер позволяет это, обеспечивает автоматическое ограничение значений. - person Andrew Thompson; 28.01.2014
comment
Я вижу, что это имеет смысл. Спасибо за предложение. (Я просто думаю, что они выглядят уродливыми =/ ) - person Nick Bolles; 29.01.2014
comment
Попробуйте спиннер в родном PLAF. - person Andrew Thompson; 29.01.2014