Java 如何从另一个JTextField更新JTextField
我正在制作一个ui,其中有两个jTextField。我想要的是当用户在第一次输入时 jtextfield应该在第二个jtextfield中镜像,增量为1,如果用户 第二个JtextField中的输入应该在第一个JtextField中使用减量进行镜像 但是我遇到了一些错误,比如IllegalStateException:试图在通知中进行变异 示例代码:Java 如何从另一个JTextField更新JTextField,java,swing,jtextfield,documentlistener,documentfilter,Java,Swing,Jtextfield,Documentlistener,Documentfilter,我正在制作一个ui,其中有两个jTextField。我想要的是当用户在第一次输入时 jtextfield应该在第二个jtextfield中镜像,增量为1,如果用户 第二个JtextField中的输入应该在第一个JtextField中使用减量进行镜像 但是我遇到了一些错误,比如IllegalStateException:试图在通知中进行变异 示例代码: public class Sh extends JFrame { public Sh() { super("SH"); JPanel pan
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);
}
}
根据委员会的建议,以下是解决方案:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
/**
* <code>Sh</code>.
*
* @author SMedvynskyy
*/
public class Sh extends JFrame
{
public Sh()
{
super("SH");
final 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);
final DocumentListener docListener = new DocumentListener(){
private Document originator;
@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) {
if (null == originator) {
originator = e.getDocument();
String text = "";
try {
text = originator.getText(0, originator.getLength());
} catch (final Exception ex) {
ex.printStackTrace();
}
if (!text.isEmpty()) {
final int p = Integer.parseInt(text);
if (originator.equals(field.getDocument())) {
final int i = (p + 1);
final String s = String.valueOf(i);
field1.setText(s);
} else {
final int i = (p - 1);
final String s = String.valueOf(i);
field.setText(s);
}
} else {
field.setText(text);
field1.setText(text);
}
originator = null;
}
}
};
field.getDocument().addDocumentListener(docListener);
field1.getDocument().addDocumentListener(docListener);
final 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)
{
final Sh s = new Sh();
s.setDefaultCloseOperation(EXIT_ON_CLOSE);
s.pack();
s.setVisible(true);
}
}
方法JTextField.setText触发DocumentEvent,因此如果您不特别避免它,您将遇到此问题(或无限递归)。您无法修改已修改的文档。虽然使用单个侦听器是一个好主意,但您需要标识此侦听器将更新的字段,并将其附加到其他侦听器。如果我们在textfield 1中输入,然后删除所有内容,则会出现一个小问题,textfield 2中仍会显示一个整数值,反之亦然versa@Rudydev我已经纠正了这个解决方案。因此,如果用户删除一个字段中的所有文本,它将在另一个字段中自动删除。非常感谢@Sergiy Medvynskyy它可以工作,请您帮助我,在这个示例中,我尝试将文本文件中的数据读取到jtextfield 1,它将在jtextfield 2中自动递增。我已经试过了,但在jtextfield 2中它并没有递增,直到我们在jtextfield 1中输入一个整数以及从文本文件读取的数据。