2012-07-05 2 views
0

Привет, я реализовал простой метод focusListener и зарегистрировал два jTextFields. То, что этот метод делает, это добавить числа в них и отобразить их в JLabel. Если я набрал в них «2», он будет правильно обновлять, чтобы дать мне 4. Однако, если я просто удалю 2 после этого, событие focusLost не будет запущено, даже если я нажму в другом месте. Если я введу 0 в JTextField, то событие focusLost будет происходить нормально. Почему это так? Благодаря!lostFocusEvent не возникает, когда я удаляю текст внутри Jtextfield?

+0

вам нужно добавить jTextField.getDocument() addDocumentListener (новый DocumentListener() {...}). –

+0

@ Liuguanghua hi Я пробовал именно это. Однако он запускает событие даже при вводе текста в него. Как я могу сделать так, чтобы событие было запущено после того, как человек закончил вводить текст в поле jtextfield (независимо от того, пустое поле или нет) – Laughy

ответ

3

Без 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(); 
      } 
     }); 
    } 
} 
+0

@Laughy : Если вы оставите 'JTextField' пустым, тогда вы обязательно получите' NumberFormatException', так как вы не сможете преобразовать '' '' в значение Integer. –

3

Один из подходов состоит в том, чтобы использовать value в JFormattedTextField, как показано на этом example и обведено here.

+0

JFormattedTextField, всегда полезно идти в этом случае :-) –

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