java多个使用类属性的类似DocumentListener如何将它们压缩到一个侦听器?
我有一个类TestListeners
,包含一些JTextFields和其他属性(这里是整数)。我希望属性在相应的JTextField文本更改时更新。因此,我添加了一些DocumentListener,但是这些监听器做的几乎完全相同,只是目标属性不同。目标是只有一个监听器可以添加到所有三个JTextField中,并且对于每个JTextField,应该处理相应的类属性
我发现以下问题帮助我将JTextField动态地输入到侦听器中,而无需在其中硬编码它们:
但是我找不到在侦听器中动态引用应该更改的属性的方法。如果有人能帮我想办法,我会很高兴的
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class TestListeners extends JFrame {
Color white = new Color(255, 255, 255);
Color red = new Color(255, 200, 200);
JTextField field1 = new JTextField("11111");
JTextField field2 = new JTextField("22222");
JTextField field3 = new JTextField("33333");
int value1 = 0;
int value2 = 0;
int value3 = 0;
public static void main(String[] args) {
new TestListeners();
}
public TestListeners() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(new Dimension(150, 100));
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx++; this.add(field1, c);
c.gridx++; this.add(field2, c);
c.gridx++; this.add(field3, c);
field1.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
filterText(field1.getText());
}
@Override
public void insertUpdate(DocumentEvent e) {
filterText(field1.getText());
}
@Override
public void changedUpdate(DocumentEvent e) {
filterText(field1.getText());
}
private void filterText(String text) {
try {
value1 = Integer.parseInt(text);
field1.setBackground(white);
System.out.println("value1 = " + value1);
} catch (NumberFormatException ex) {
System.out.println("text in field1 is not an integer");
field1.setBackground(red);
}
}
});
field2.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
filterText(field2.getText());
}
@Override
public void insertUpdate(DocumentEvent e) {
filterText(field2.getText());
}
@Override
public void changedUpdate(DocumentEvent e) {
filterText(field2.getText());
}
private void filterText(String text) {
try {
value2 = Integer.parseInt(text);
field2.setBackground(white);
System.out.println("value2 = " + value2);
} catch (NumberFormatException ex) {
System.out.println("text in field2 is not an integer");
field2.setBackground(red);
}
}
});
field3.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
filterText(field3.getText());
}
@Override
public void insertUpdate(DocumentEvent e) {
filterText(field3.getText());
}
@Override
public void changedUpdate(DocumentEvent e) {
filterText(field3.getText());
}
private void filterText(String text) {
try {
value3 = Integer.parseInt(text);
field3.setBackground(white);
System.out.println("value3 = " + value3);
} catch (NumberFormatException ex) {
System.out.println("text in field3 is not an integer");
field3.setBackground(red);
}
}
});
this.setVisible(true);
}
}
# 1 楼答案
您正在使用匿名类来实现
DocumentListner
当然,您可以创建一个新类
您必须将对要更改的GUI项的引用传递给
MyDocumentListener
的新实例请注意,成员变量没有任何修饰符。因此,该成员受数据包保护。只要你的新类与
TestListeners
处于同一个打包状态,你就可以在没有getter的情况下访问它们。否则,为该值实现getter和setter可以通过实现适当的构造函数来实现这一点
然后可以像这样添加
DocumentListner
:我们必须将“this”传递给MyDocumentListner的新实例,以便新的侦听器能够从中访问字段
或者,您可以创建一个由匿名类组成的对象:
然后你可以像这样把
DocumentListener
传递给你的字段:# 2 楼答案
从关注监听器之间的共同点开始,它们会验证
JTextField
的状态,但也会保持最后一个有效值因此,您需要一个监听器,它可以从
JTextField
获取文本,可以根据当前文本更改其状态,并且可以保持最后一个有效值,比如现在,坦白地说,对于已经实现的东西来说,这似乎是很多工作
例如,您可以使用
JSpinner
或JFormattedTextField
或事件DocumentFilter
来阻止用户输入除所需内容以外的任何内容见:
更多细节