2013-10-24 9 views
1

Я создал приложение, которое использует FocusListener, чтобы убедиться, что значение text fieid всегда положительное. Когда пользователь вводит отрицательное значение, а затем нажмите клавишу «tab», чтобы переместить фокус в сторону от текстового поля, значение будет умножено на -1, чтобы приведенное значение было положительным. Однако, когда я запускал приложение, текстовое поле не менялось. Я не уверен, что я сделал не так, и буду признателен за любую помощь.FocusListener на JTextField не работает

Вот мой код:

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 

public class AlwaysPositive extends JFrame implements FocusListener { 
JTextField posField = new JTextField("30",5); 

public AlwaysPositive() { 
    super("AlwaysPositive"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel pane = new JPanel(); 
    JTextField posField = new JTextField("30",5); 
    JButton ok= new JButton("ok"); 
    posField.addFocusListener(this); 
    pane.add(posField); 
    pane.add(ok); 
    add(pane); 
    setVisible(true); 
} 

public void focusLost(FocusEvent event) { 
    try { 
     float pos = Float.parseFloat(posField.getText()); 
     if (pos < 0) 
      pos = pos*-1; 
     posField.setText("" + pos); 
    } catch (NumberFormatException nfe) { 
     posField.setText("0"); 
    } 
} 

public void focusGained(FocusEvent event) { 
} 

public static void main(String[] arguments) { 
    AlwaysPositive ap = new AlwaysPositive(); 
} 

}

ответ

1

Основная проблема заключается вы затенения ваши переменные

Вы объявляете

JTextField posField = new JTextField("30",5); 

В качестве переменной экземпляра, но в ваш конструктор, вы повторно его повторно ...

public AlwaysPositive() { 
    //... 
    JTextField posField = new JTextField("30",5); 
    posField.addFocusListener(this); 
    //... 
} 

Добавить прикрепить фокус слушателя к нему, но в методе focusLost, вы имеете в виду переменную экземпляра, который не является один, что на самом деле на экране

Start путем изменения объявления в конструктор

public AlwaysPositive() { 
    //... 
    posField = new JTextField("30",5); 
    posField.addFocusListener(this); 
    //... 
} 

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

Например, вы можете использовать InputVerifier, который позволит вам проверить значение поля и принять решение о необходимости перемещения фокуса или нет.

Взгляните на How to Use the Focus Subsystem и Validating Input в частности

Вы можете также использовать DocumentFilter, чтобы ограничить то, что пользователь может фактически войти, фильтрация ввода в качестве пользовательских типов его. Посмотрите на Text Component Features и Implementing a Document Filter в частности.

Вы также можете посмотреть на these examples для большего количества идей

+0

Сегодня я объяснил проблему с 'InputVerifier' [здесь] (http://stackoverflow.com/questions/19565839/input-verifier-effect-not-work-by-click-just-work-by- Закладка кнопки/19566591 # 19566591). Хотя проблема заключается не в верификаторе, а в основном использовании и дизайне. не могли бы вы взглянуть? – Sage

+0

Большое вам спасибо за подробное объяснение! – user2533006

1

При создании объекта таким же именем внутри метода, слушатель настраивается на объект метода, а не к объекту класса.

Смежные вопросы