Java 如何将文档侦听器添加到面板内的JTextFields?
我有一个扩展JPanel的类,在这个面板中我添加了很多textField。 我想将DocumentListener添加到每个textField,以检测文本的更改,并将txtField的颜色改为红色。 我做了下面的事情,但还没有工作 有人能帮忙解决这个问题吗,或者欢迎任何新的建议?Java 如何将文档侦听器添加到面板内的JTextFields?,java,swing,jtextfield,documentlistener,Java,Swing,Jtextfield,Documentlistener,我有一个扩展JPanel的类,在这个面板中我添加了很多textField。 我想将DocumentListener添加到每个textField,以检测文本的更改,并将txtField的颜色改为红色。 我做了下面的事情,但还没有工作 有人能帮忙解决这个问题吗,或者欢迎任何新的建议? public class MainDetailPanel extends JPanel implements DocumentListener{ public JLabel lblS_DWLDIRPRDPIC,lblL
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);
}
}
无法将文档强制转换为JTextField。JTextField有一个文档。但是JTextField
不是一个
文档
好的,您必须为每个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);
}
}
您应该使用factory方法创建文本字段:
private JTextField createTextFieldBecomingRed() {
JTextField tf = new JTextField(30);
tf.addDocumentListener(new BecomingRedDocumentListener(tf));
return tf;
}
无法将文档强制转换为JTextField。JTextField有一个文档。但是JTextField
不是一个
文档
好的,您必须为每个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);
}
}
您应该使用factory方法创建文本字段:
private JTextField createTextFieldBecomingRed() {
JTextField tf = new JTextField(30);
tf.addDocumentListener(new BecomingRedDocumentListener(tf));
return tf;
}
什么不起作用?您期望什么,以及会发生什么?线程“AWT-EventQueue-1”java.lang.ClassCastException中的异常:位于de.util.scanners.view.MainDetailPanel.insertUpdate(MainDe)的javax.swing.text.PlainDocument什么不起作用?您期望什么,以及会发生什么?线程“AWT-EventQueue-1”java.lang.ClassCastException中的异常:位于de.util.scanners.view.MainDetailPanel.insertUpdate(MainDe)的javax.swing.text.PlainDocumenttailPanel.java:107)谢谢,它正在工作,但在我的例子中有一个小问题。在创建此面板时,一切正常(bg为白色)。稍后单击文件,这些文本字段将获得默认值,此时bg也必须保持白色。如何解决这个问题?第二个问题是,当添加新字符时,背景应该是红色的,如果删除新添加的字符,背景应该是白色的。此外,当一个字符从原始文本中删除时,背景应该是红色的,如果我们将一个字符放回原处,背景应该是白色的。诚恳地说,你应该能够自己解决这个问题。第一个问题:停用侦听器,或者在填充字段后将颜色重置为白色。第二个问题:将新文本与原始文本进行对比,并相应地设置背景色。谢谢,它正在工作,但在我的情况下存在一个小问题。在创建此面板时,一切正常(bg为白色)。稍后单击文件,这些文本字段将获得默认值,此时bg也必须保持白色。如何解决这个问题?第二个问题是,当添加新字符时,背景应该是红色的,如果删除新添加的字符,背景应该是白色的。此外,当一个字符从原始文本中删除时,背景应该是红色的,如果我们将一个字符放回原处,背景应该是白色的。诚恳地说,你应该能够自己解决这个问题。第一个问题:停用侦听器,或者在填充字段后将颜色重置为白色。第二个问题:将新文本与原始文本进行对比,并相应地设置背景色。