【发布时间】:2014-12-04 04:07:06
【问题描述】:
我正在制作一个包含两个 jtextfields 的 ui。我想要的是当用户第一次输入时 jtextfield 它应该在第二个 jtextfield 中镜像,增量为 1,如果用户 在第二个 JtextField 中的输入它应该在第一个 jtextfield 中镜像,并减少 的 1.But 我收到类似 IllegalStateException:Attempt to mutate in notification 之类的错误。
示例代码:
public class Sh extends JFrame
{
public Sh()
{
super("SH");
JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);
final JTextField field = new JTextField(10);
panel.add(field);
final JTextField field1 = new JTextField(10);
panel.add(field1);
DocumentListener docListener = new DocumentListener(){
@Override
public void changedUpdate(DocumentEvent e) {
updateLabel(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
updateLabel(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
updateLabel(e);
}
private void updateLabel(DocumentEvent e) {
String text = field.getText();
String text1 = field1.getText();
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p + 1);
String s = String.valueOf(i);
field1.setText(s);
} else if (!text1.isEmpty()) {
int p = Integer.parseInt(text1);
int i = (p - 1);
String s = String.valueOf(i);
field.setText(s);
}
}
};
field.getDocument().addDocumentListener(docListener);
field1.getDocument().addDocumentListener(docListener);
DocumentFilter docFilter = new DocumentFilter(){
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove non-digits
}
@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove non-digits
}
};
((AbstractDocument) field.getDocument()).setDocumentFilter(docFilter);
((AbstractDocument) field1.getDocument()).setDocumentFilter(docFilter);
}
public static void main(String[] args)
{
Sh s = new Sh();
s.setDefaultCloseOperation(EXIT_ON_CLOSE);
s.pack();
s.setVisible(true);
}
}
【问题讨论】:
-
您不能修改已修改的文档。虽然使用单个侦听器的想法是个好主意,但您需要确定该侦听器将更新的字段,并且应该将其附加到另一个
标签: java swing jtextfield documentlistener documentfilter