Заменить текст числом в TextField

У меня есть это поле, в которое я вставляю номер порта. Я хотел бы автоматически преобразовать строку в число:

fieldNport = new TextField();
    fieldNport.setPrefSize(180, 24);
    fieldNport.setFont(Font.font("Tahoma", 11));
    grid.add(fieldNport, 1, 1);

Можете ли вы сказать, как я могу это сделать? Я не могу найти подходящий пример в переполнении стека.

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

Может быть, это:

 fieldNport.textProperty().addListener(new ChangeListener()
        {
            @Override
            public void changed(ObservableValue o, Object oldVal, Object newVal)
            {
                try
                {
                    int Nport = Integer.parseInt((String) oldVal);
                }
                catch (NumberFormatException e)
                {

                }
            }
        });

person Peter Penzov    schedule 26.11.2013    source источник
comment
Напишите слушатель, который читает текст TextField, и избавьтесь от букв.   -  person Fabinout    schedule 26.11.2013
comment
Пример? У меня есть очень базовые знания для JavaFX?   -  person Peter Penzov    schedule 26.11.2013
comment
Что насчет этого Integer.parseInt(fieldNport.getText())?   -  person Peter Penzov    schedule 26.11.2013
comment
TextField.text — это свойство, это означает, что вы можете добавлять слушателей прямо в это свойство. Итак, у вас есть что-то вроде: fieldNPort.text.addListener(new Event....) Знаете ли вы прослушиватели и события в Java?   -  person Fabinout    schedule 26.11.2013
comment
Могу ли я использовать Integer.parseInt(fieldNport.getText()) или это не рекомендуется?   -  person Peter Penzov    schedule 26.11.2013
comment
Это хорошая идея, да ;)   -  person Fabinout    schedule 26.11.2013
comment
Что теперь делает ваш код в Listener? Я не буду делать работу за вас, но я буду вести вас, мы доберемся туда.   -  person Fabinout    schedule 26.11.2013


Ответы (3)


Вы можете написать что-то вроде этого:

fieldNPort.text.addListener(new ChangeListener(){
        @Override public void changed(ObservableValue o,Object oldVal, Object newVal){
             //Some Code
             //Here you can use Integer.parseInt methods inside a try/catch 
             //because parseInt throws Exceptions
        }
      });

Вот все, что вам нужно о свойствах и слушателях в JavaFX:
http://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm
Если у вас есть какие-либо вопросы, я буду рад помочь.

person Fabinout    schedule 26.11.2013
comment
Я снова обновил код. Можете ли вы порекомендовать мне некоторые улучшения кода? - person Peter Penzov; 26.11.2013
comment
Теперь вы должны понимать, что часть кода try/catch будет выполняться КАЖДЫЙ раз, когда пользователь изменяет свойство text. - person Fabinout; 26.11.2013
comment
Вы не должны исправлять это. Поскольку это то, чего вы пытаетесь достичь, вы позволяете людям писать то, что они хотят, и фильтруете это. Если Integer.parseInt(string) работает, это означает, что строка состоит из цифр. Если он выдает исключение, вы должны использовать метод Java для удаления всех нецифровых символов. Например: stackoverflow.com/ вопросы/10372862/ - person Fabinout; 26.11.2013

Начиная с JavaFX 8u40, вы можете установить TextFormatter объект в текстовом поле:

UnaryOperator<Change> filter = change -> {
    String text = change.getText();

    if (text.matches("[0-9]*")) {
        return change;
    }

    return null;
};
TextFormatter<String> textFormatter = new TextFormatter<>(filter);
fieldNport = new TextField();
fieldNport.setTextFormatter(textFormatter);

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

person Uwe    schedule 05.04.2016

Возможно, это то, что вам нужно:

fieldNPort= new TextField()
    {
        @Override
        public void replaceText(int start, int end, String text)
        {
            if (text.matches("[0-9]*"))
            {
                super.replaceText(start, end, text);
            }
        }

        @Override
        public void replaceSelection(String text)
        {
            if (text.matches("[0-9]*"))
            {
                super.replaceSelection(text);
            }
        }
    };

Это запретит пользователям вводить что-либо, кроме чисел (вы можете изменить выражение регулярного выражения в соответствии с вашими потребностями), и тогда вам не придется беспокоиться о том, что Integer.parseInt будет выброшено какое-либо исключение.

person Aspirant    schedule 26.11.2013