2011-01-06 5 views
1

JTextField에 documentListener가 있습니다. 이 텍스트 필드에 문자를 추가하거나 제거 할 때 배경색을 변경하고 싶습니다. 내가 올바른 문서 수신기를 사용해야합니까? 작동하지만,이 JTextfield에 초점을 맞추지 않으면 불이납니다. 이 JTextField에 포커스 리스너를 추가하지 않습니다. 여기 내 코드, 내 문제를 해결할 수있는 방법에 대한 제안은 무엇입니까?포커스를 변경할 때 insertUpdate가 내 DocumentListener에서 호출되는 이유는 무엇입니까? (Java Swing)

 numPlotRowsJTextField = BasicComponentFactory.createIntegerField(valueModelNumberPlotRowsJTextField); 
     numPlotRowsJTextField.getDocument().addDocumentListener(new DocumentListener() { 

     @Override 
     public void removeUpdate(DocumentEvent e) 
     { 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) 
     { 
      numPlotRowsJTextField.setBackground(Color.cyan); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) 
     { 
     } 
    }); 

또한이 문제의 근본 원인이라고 생각되는 JGoodies Binding을 사용 중입니다. JGoodies가없는 스윙은 포커스를 변경하여 문서 수신기 이벤트를 시작해서는 안됩니다 ...

답변

1

나는 그것을 알아 냈다. 100 %는 JGoodies Binding과 관련이 있습니다.

이 코드는 작동합니다

ValueModel valueModelNumberPlotRowsJTextField = adapter.getBufferedModel("numberOfPlotRows"); 
    valueModelNumberPlotRowsJTextField.addValueChangeListener(new PropertyChangeListener() { 

     @Override 
     public void propertyChange(PropertyChangeEvent evt) 
     { 
      numPlotRowsJTextField.setBackground(Color.cyan); 
     } 
    }); 
    numPlotRowsJTextField = BasicComponentFactory.createIntegerField(valueModelNumberPlotRowsJTextField); 

내가 JGoodies 바인딩을 사용하고 있기 때문에, 나는 ValueModel 내 JTextField를 역행있다. 리스너는 JTextField가 아닌 리스너에 설정해야합니다.

1

포커스가있는 것이 있거나 발사 중이라고 생각하는 것이지 그렇지 않습니다.

코드를 작성하여 완전한 예제를 작성했지만 사용자가 설명하는 문제가 없습니다.

 JFrame frame = new JFrame(); 
    final JTextField numPlotRowsJTextField = new JTextField(3); 
    numPlotRowsJTextField.getDocument().addDocumentListener(new DocumentListener() { 
     @Override 
     public void changedUpdate(DocumentEvent e) { 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      numPlotRowsJTextField.setBackground(Color.cyan); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
     } 
    }); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(100, 100); 
    frame.getContentPane().setLayout(new FlowLayout()); 
    frame.getContentPane().add(new JTextField(2)); 
    frame.getContentPane().add(numPlotRowsJTextField); 
    frame.setVisible(true); 
+0

JGoodies Binding이 어떻게 든 나를 엉망으로 만들고 있다고 생각합니다. 초점을 변경해도 DocumentListener가 insertUpdate를 시작하도록해야합니다. 아마도 JGoodies 버퍼링 된 입력을 사용하고 있고 입력을 쉽게 재설정 할 수있는 방아쇠와 관련이 있습니다. 어떤 JGoodies 바인딩 전문가가 있습니까? – smuggledPancakes

1

DocumentEvent에 포함 된 정보를 확인하셨습니까? 실제로 변경된 문자열을 포함하고 있습니까? 아니면 길이가 0 인 문자열 일뿐입니다. 후자의 경우 어쩌면 당신은 그 사건을 무시할 수 있습니다.