2012-05-23 4 views
1

JPanel을 확장하는 클래스가 있습니다.이 패널 안에는 많은 textField가 추가되었습니다. TextListener를 모든 textField에 추가하여 텍스트 변경 사항을 감지하고 txtField의 bachground를 빨간색으로 변경하려고합니다. 다음과 같이했지만 아직 작동하지 않습니다.패널 내부의 JTextFields에 Listener를 추가하는 방법은 무엇입니까?

누구든지 해결할 수 있습니까? 아니면 새로운 제안을 환영합니까?

public class MainDetailPanel extends JPanel implements DocumentListener{ 
public JLabel lblS_DWLDIRPRDPIC,lblL_DWLDIRPRD,lblS_UPLDIR,lblL_UPLDIR,lblS_DWLDIRPRD; 
public JLabel lblFTP_DEFDIR,lblFTP_SERVER,lblFTP_POORT,lblFTP_USER,lblFTP_PASWOORD,lblL_CFDIR; 
public JLabel lblL_DWLDIRPRDPIC,lblS_CFDIR,lblS_CFNAME,lblS_DWLNAMEPRD,lblS_DWLNAMEPRDPIC; 

public JTextField txtL_DWLDIRPRD,txtS_DWLDIRPRDPIC,txtL_UPLDIR,txtS_DWLNAMEPRDPIC,txtL_CFDIR; 
public JTextField txtFTP_DEFDIR,txtFTP_SERVER,txtFTP_POORT,txtFTP_USER,txtFTP_PASWOORD,txtS_UPLDIR; 
public JTextField txtL_DWLDIRPRDPIC,txtS_CFDIR,txtS_CFNAME,txtS_DWLNAMEPRD,txtS_DWLDIRPRD; 
public MainDetailPanel() { 
    createComponents(); 
    layoutComponents(); 
} 

private void createComponents() { 
    txtL_DWLDIRPRD  = new JTextField(30); 
    txtL_DWLDIRPRD.getDocument().addDocumentListener(this); 
    txtS_DWLDIRPRDPIC = new JTextField(30); 
    txtL_UPLDIR   = new JTextField(30); 
    txtS_DWLNAMEPRDPIC = new JTextField(30); 
    txtFTP_DEFDIR  = new JTextField(30); 
    txtFTP_SERVER  = new JTextField(30); 
    txtFTP_POORT  = new JTextField(30); 
    txtFTP_USER   = new JTextField(30); 
    txtFTP_PASWOORD  = new JTextField(30); 
    txtL_CFDIR   = new JTextField(30); 
    txtL_DWLDIRPRDPIC = new JTextField(30); 
    txtS_UPLDIR   = new JTextField(30); 
    txtS_CFDIR   = new JTextField(30); 
    txtS_CFNAME   = new JTextField(30); 
    txtS_DWLNAMEPRD  = new JTextField(30); 
    txtS_DWLDIRPRD  = new JTextField(30); 

    lblFTP_DEFDIR  = new JLabel("FTP_DEFDIR"); 
    lblFTP_SERVER  = new JLabel("FTP_SERVER"); 
    lblFTP_POORT  = new JLabel("FTP_POORT"); 
    lblFTP_USER   = new JLabel("FTP_USER"); 
    lblFTP_PASWOORD  = new JLabel("FTP_PASWOORD"); 
    lblL_CFDIR   = new JLabel("L_CFDIR"); 
    lblL_UPLDIR   = new JLabel("L_UPLDIR"); 
    lblL_DWLDIRPRDPIC = new JLabel("L_DWLDIRPRDPIC"); 
    lblS_CFDIR   = new JLabel("S_CFDIR"); 
    lblS_CFNAME   = new JLabel("S_CFNAME"); 
    lblS_DWLNAMEPRD  = new JLabel("S_DWLNAMEPRD"); 
    lblS_DWLDIRPRD  = new JLabel("S_DWLDIRPRD"); 
    lblS_DWLNAMEPRDPIC = new JLabel("S_DWLNAMEPRDPIC"); 
    lblS_UPLDIR   = new JLabel("S_UPLDIR"); 
    lblS_DWLDIRPRDPIC = new JLabel("lblS_DWLDIRPRDPIC"); 
    lblL_DWLDIRPRD  = new JLabel("lblL_DWLDIRPRD"); 
} 

private void layoutComponents() { 
    setLayout(new ParagraphLayout()); 
    add(lblFTP_DEFDIR, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtFTP_DEFDIR); 
    add(lblFTP_SERVER, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtFTP_SERVER); 
    add(lblFTP_POORT, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtFTP_POORT); 
    add(lblFTP_USER, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtFTP_USER); 
    add(lblFTP_PASWOORD, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtFTP_PASWOORD); 
    add(lblL_CFDIR, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtL_CFDIR); 
    add(lblL_UPLDIR, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtL_UPLDIR); 
    add(lblL_DWLDIRPRD, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtL_DWLDIRPRD); 
    add(lblL_DWLDIRPRDPIC, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtL_DWLDIRPRDPIC); 
    add(lblS_UPLDIR, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtS_UPLDIR); 
    add(lblS_CFDIR, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtS_CFDIR); 
    add(lblS_CFNAME, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtS_CFNAME); 
    add(lblS_DWLNAMEPRD, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtS_DWLNAMEPRD); 
    add(lblS_DWLDIRPRD, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtS_DWLDIRPRD); 
    add(lblS_DWLNAMEPRDPIC, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtS_DWLNAMEPRDPIC); 
    add(lblS_DWLDIRPRDPIC, ParagraphLayout.NEW_PARAGRAPH); 
    add(txtS_DWLDIRPRDPIC); 
} 

public void insertUpdate(DocumentEvent e) { 
    ((JTextField)e.getDocument()).setBackground(Color.red); 
} 

public void removeUpdate(DocumentEvent e) { 
    ((JTextField)e.getDocument()).setBackground(Color.red); 
} 

public void changedUpdate(DocumentEvent e) { 
    ((JTextField)e.getDocument()).setBackground(Color.red); 
} 


} 
+0

작동하지 않는 기능은 무엇입니까? 너는 무엇을 기대하며, 대신에 어떤 일이 일어나는가? –

+0

스레드 "AWT-EventQueue-1"예외 java.lang.ClassCastException : javax.swing.text.PlainDocument at de.util.scanners.view.MainDetailPanel.insertUpdate (MainDe tailPanel.java:107) – itro

답변

9

문서를 JTextField로 변환 할 수 없습니다. JTextField 에는 문서가 있습니다. 그러나 JTextField is not a 문서.

AFAIK, 당신은 모든 JTextField를위한 별도의 수신기를 사용하여 수신기에 JTextField를의 참조를 제공해야합니다 :

private static class BecomingRedDocumentListener implements DocumentListener { 
    private JTextField textField; 

    public BecomingRedDocumentListener(JTextField textField) { 
     this.textField = textField; 
    } 
    @Override 
    public void insertUpdate(DocumentEvent e) { 
     textField.setBackground(Color.red); 
    } 
    @Override 
    public void removeUpdate(DocumentEvent e) { 
     textField.setBackground(Color.red); 
    } 
    @Override 
    public void changedUpdate(DocumentEvent e) { 
     textField.setBackground(Color.red); 
    } 
} 

그리고 당신은 당신의 텍스트 필드를 만들 공장 방법을 사용해야합니다 :

private JTextField createTextFieldBecomingRed() { 
    JTextField tf = new JTextField(30); 
    tf.addDocumentListener(new BecomingRedDocumentListener(tf)); 
    return tf; 
} 
+0

나는 이것을 생각하지 않았다. 깨끗한 +1 – mprabhat

+0

+1 훨씬 더;) – dacwe

+0

고마워요,하지만 내 경우에는 작은 문제가 있습니다.이 패널을 만들기 시작하면 모든 것이 OK입니다 (bg는 흰색 임). 나중에 파일을 클릭하면이 텍스트 필드는 기본값이되며이 때도 bg는 흰색으로 유지되어야합니다. *** 어떻게하면이 문제를 해결할 수 있습니까? *** – itro

관련 문제