如何将文档侦听器添加到面板内的 JTextFields?

Posted

技术标签:

【中文标题】如何将文档侦听器添加到面板内的 JTextFields?【英文标题】:how to add document Listener to the JTextFields inside a panel? 【发布时间】:2012-05-29 20:44:45 【问题描述】:

我有一个扩展 JPanel 的类,在这个面板中我添加了很多 textField。 我想将 DocumentListener 添加到每个 textField 以检测文本的更改并将 txtField 的背景更改为红色。 我做了如下的事情,但还没有工作。

任何人都可以帮助解决它或欢迎任何新的建议?

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);




【问题讨论】:

什么不起作用?你期望什么,会发生什么? 线程“AWT-EventQueue-1”中的异常 java.lang.ClassCastException: javax.swing.text.PlainDocument at de.util.scanners.view.MainDetailPanel.insertUpdate(MainDe‌​tailPanel.java: 107) 【参考方案1】:

您不能将 Document 转换为 JTextField。 JTextField 一个文档。但是 JTextField is not a Document.

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;

【讨论】:

谢谢它正在工作,但在我的情况下有一个小问题。在创建此面板开始时一切正常(bg 为白色)。稍后通过单击文件,这些文本字段将变为默认值值,此时bg也必须留白。 我该如何解决这个问题? 第二个问题是,当新添加的东西时,bg应该是红色的,如果我们删除新添加的字符,bg应该是白色的。同样,当从原始文本中删除一个字符时,bg 应该是红色的,如果我们设置一个字符,bg 应该是白色的。 真诚地,您应该能够自己解决这个问题。第一个问题:立即停用侦听器,或在填充字段后将颜色重置为白色。第二个问题:将新文本与原始文本进行比较,并相应地设置背景颜色。 我很确定tf.addDocumentListener() 不会因为您给出的原因而工作:JTextField 不是文档。不应该是tf.getDocument().addDocumentListener()吗?

以上是关于如何将文档侦听器添加到面板内的 JTextFields?的主要内容,如果未能解决你的问题,请参考以下文章

将 jquery 添加到管理面板内的 Magento 页面 [所见即所得编辑器]

JSF 2 - 如何将 Ajax 侦听器方法添加到复合组件接口?

将扩展面板添加到角材料表内的行

将事件侦听器添加到在新窗口中打开的文档中

extjs 面板的可拖动事件

如何从事件侦听器内部将数据添加到同步广播 StreamController 到该控制器的 Stream?