두 개의 텍스트 필드 (지금부터 A와 B)가 사용자 입력과 동일한 내용을 공유하고 싶습니다. 하나의 거울을 다른 거울 (B 거울 A) 또는 반대편 (A 거울 B)으로 만들 수 있습니다. 그러나 두 DocumentListeners를 모두 유지하면 예외가 throw되기 시작합니다.JTextFields 및 DocumentListeners
오라클의 Docs에 따르면 DocumentListener를 사용하여 Listener 자체에서 문서의 내용을 변경할 수 없습니다. 나는 이미 첫 번째 경우 (B 미러 A) 또는 그 반대의 경우에 그것을 수행 한 이후로 이상한 것을 발견합니다. 어쨌든 코드는 여전히 "작동"하지만 트리거 된 두 개의 이벤트가 발생할 때마다 예외가 발생합니다.
KeyListeners는이 특정 케이스에 대해 신뢰할 수 없으며 DocumentListener가 제공하는 실시간 모양이 좋기 때문에 버튼 사용을 거부합니다.
제안 사항?
여기 내 코드입니다 :
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class Mirror {
private JTextField oriText;
private JTextField mirrorText;
private static int debugCounter; //Counts the times an Event is Triggered.
public static void main(String[] args) {
Mirror gui = new Mirror();
gui.build();
}
public void build(){
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.gridx = 0;
c.gridy = 0;
JLabel original = new JLabel("Original");
panel.add(original, c);
c.gridy = 1;
oriText = new JTextField(10);
panel.add(oriText,c);
c.gridy = 2;
JLabel mirror = new JLabel("Mirror");
panel.add(mirror, c);
c.gridy = 3;
mirrorText = new JTextField(10);
panel.add(mirrorText, c);
mirrorText.getDocument().addDocumentListener(new MyDocumentListenerII()); // Comment this line to see only the 1st Case (B mirrors A)
oriText.getDocument().addDocumentListener(new MyDocumentListener()); // Comment this line to see only the 2nd Case (A mirrors B)
frame.pack();
frame.setVisible(true);
}
class MyDocumentListener implements DocumentListener{
@Override
public void changedUpdate(DocumentEvent e) {
//Does nothing.
}
@Override
public void insertUpdate(DocumentEvent e) {
mirror();
}
@Override
public void removeUpdate(DocumentEvent e) {
mirror();
}
}
class MyDocumentListenerII implements DocumentListener{
@Override
public void changedUpdate(DocumentEvent e) {
// Does nothing.
}
@Override
public void insertUpdate(DocumentEvent e) {
mirror1();
}
@Override
public void removeUpdate(DocumentEvent e) {
mirror1();
}
}
public void mirror(){
if (!oriText.getText().equals(mirrorText.getText())){ //Without this each Event trigger the other in some sort of Paradoxical cycle.
mirrorText.setText(oriText.getText());
debugCounter++;
System.out.println(debugCounter+" events triggered");
}
}
public void mirror1(){
if (!mirrorText.getText().equals(oriText.getText())){
oriText.setText(mirrorText.getText());
debugCounter++;
System.out.println(debugCounter+" events triggered");
}
}
}
Nailed it !!! 고마워, 젠장 ... 나는 보통의 "문서 필터 사용"대신에 이와 같은 대답을 얻기를 바랬다. 당신이 아마 알아 냈으므로 비록 합법적 인 것일 필요가 없다고하더라도 나는 테스트하고 싶습니다. –