Привет, я реализовал простой метод focusListener и зарегистрировал в нем два jTextFields. Что делает этот метод, так это добавляет в них числа и отображает их в JLabel. Если я введу в них «2», он будет правильно обновлен, чтобы дать мне 4. Однако, если я просто удалю 2 после этого, событие focusLost не будет запущено, даже если я щелкну в другом месте. Если я введу 0 в JTextField, то событие focusLost произойдет нормально. Почему это так? Спасибо!
LostFocusEvent не происходит, когда я удаляю текст внутри Jtextfield?
comment
вам нужно добавить jTextField.getDocument().addDocumentListener(new DocumentListener(){...}).
- person Liu guanghua   schedule 05.07.2012
comment
@Liuguanghua привет, я пробовал именно это. Однако он запускает событие, даже когда я ввожу в него текст. Как я могу сделать так, чтобы событие запускалось после того, как человек закончил вводить текст в поле jtextfield? (независимо от того, пустое это поле или нет)
- person Laughy   schedule 05.07.2012
Ответы (2)
Без SSCCE трудно сказать, какую логику вы используете в своем случае. Поскольку в следующем примере он работает так, как вы ожидаете:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class TextFieldExample
{
private JTextField tfield1;
private JTextField tfield2;
private JLabel label;
private FocusListener tfieldListener = new FocusListener()
{
@Override
public void focusGained(FocusEvent fe)
{
}
@Override
public void focusLost(FocusEvent fe)
{
String num1 = tfield1.getText().trim();
String num2 = tfield2.getText().trim();
if (num1 == null || num1.equals(""))
num1 = "0";
if (num2 == null || num2.equals(""))
num2 = "0";
label.setText(Integer.toString(Integer.parseInt(num1) + Integer.parseInt(num2)));
}
};
private void displayGUI()
{
JFrame frame = new JFrame("Text Field Focus Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
tfield1 = new JTextField(10);
tfield2 = new JTextField(10);
tfield1.addFocusListener(tfieldListener);
tfield2.addFocusListener(tfieldListener);
((AbstractDocument)tfield1.getDocument()).setDocumentFilter(new MyDocumentFilter());
((AbstractDocument)tfield2.getDocument()).setDocumentFilter(new MyDocumentFilter());
label = new JLabel("SUM IS");
contentPane.add(tfield1);
contentPane.add(tfield2);
contentPane.add(label);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
class MyDocumentFilter extends DocumentFilter
{
@Override
public void insertString(FilterBypass fb, int offset
, String text
, AttributeSet aset)
{
try
{
super.insertString(fb, offset, text.replaceAll("\\D++", ""), aset);
}
catch(BadLocationException ble)
{
ble.printStackTrace();
}
}
@Override
public void replace(FilterBypass fb, int offset, int len
, String text
, AttributeSet aset)
{
try
{
super.replace(fb, offset, len, text.replaceAll("\\D++", ""), aset);
}
catch(BadLocationException ble)
{
ble.printStackTrace();
}
}
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new TextFieldExample().displayGUI();
}
});
}
}
person
nIcE cOw
schedule
05.07.2012
@Laughy: Если вы оставите
JTextField
пустым, вы обязательно получите NumberFormatException
, поскольку вы не сможете преобразовать ""
в целочисленное значение.
- person nIcE cOw; 05.07.2012
Один из подходов заключается в использовании свойства value
в JFormattedTextField
a>, как показано в этом примере и описано здесь.
person
trashgod
schedule
05.07.2012