2012-07-05 4 views
0

안녕하세요, 간단한 focusListener 메서드를 구현하고 그것에 두 jTextFields를 등록했습니다. 이 메소드가 수행하는 작업은 숫자를 추가하여 JLabel에 표시하는 것입니다. 내가 "2"라고 입력하면 올바르게 업데이트되어 4를 얻습니다. 그러나 나중에 2를 삭제하면 다른 곳을 클릭해도 focusLost 이벤트가 실행되지 않습니다. JTextField에 0을 입력하면 focusLost 이벤트가 정상적으로 발생합니다. 왜 이렇게이다? 감사!Jtextfield에서 텍스트를 삭제할 때 lostFocusEvent가 발생하지 않습니까?

+0

당신은 jTextField.getDocument() addDocumentListener를 추가해야합니다 (새 DocumentListener를() {...}). –

+0

@Liuguanghua 안녕하세요. 그러나 텍스트를 입력 할 때도 이벤트가 발생합니다. 사람이 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'을 얻을 수 있습니다. 왜냐하면''''을 정수 값으로 변환 할 수 없기 때문입니다. –

3

examplehere에 나와있는 것처럼 속성을 JFormattedTextField에 활용하는 것이 하나의 방법입니다.

+0

JFormattedTextField는 항상이 경우에 적합합니다 .-) –