Java 使用文档侦听器将jtextfield值同步为唯一整数值
在问题之后 我尝试使用document listener从答案中修改示例。我想修改的是只同步整数。例如,如果我将“2”放在字段1中,那么它将乘以“5”,因此字段2中的值将为“10”。然而,我采用了各种方法,但我有一些错误,例如: 线程“AWT-EventQueue-0”java.lang.NumberFormatException中的异常:用于输入字符串:“” 此外,当我从field1中删除所有值时,最后一个同步的field2值保持不变,而field2也应该作为field1为null。我不知道我犯了什么错误。以下是UpdateLabel方法的代码示例:Java 使用文档侦听器将jtextfield值同步为唯一整数值,java,swing,jtextfield,documentlistener,Java,Swing,Jtextfield,Documentlistener,在问题之后 我尝试使用document listener从答案中修改示例。我想修改的是只同步整数。例如,如果我将“2”放在字段1中,那么它将乘以“5”,因此字段2中的值将为“10”。然而,我采用了各种方法,但我有一些错误,例如: 线程“AWT-EventQueue-0”java.lang.NumberFormatException中的异常:用于输入字符串:“” 此外,当我从field1中删除所有值时,最后一个同步的field2值保持不变,而field2也应该作为field1为null。我不知道我
private void updateLabel(DocumentEvent e) {
java.awt.EventQueue.invokeLater(new Runnable() {
String text = field.getText();
String text1 = field1.getText();
@Override
public void run() {
if(text == null && text1 != null){field1.setText(null);
}else
if(text.contains("-") ||
text.contains(".") ||
text.matches(".*[a-zA-Z].*")||
text.matches(".*\\p{Punct}.*")){
{JOptionPane.showMessageDialog(frame = new JFrame(),
"Please put appropriate int value from 0-9",
"Inane error",
JOptionPane.ERROR_MESSAGE);
field.setText(null);
field1.setText(null);
}
}else{
int p;
p = Integer.parseInt(text);
int i = (p*5);
String s = String.valueOf(i);
field1.setText(s);
}
}
});
}
我还想将“.”与整数一起使用,但当我删除text.contains(“.”)时,它仍会显示JOptionPane
错误消息
int p=0;
try {
p = Integer.parseInt(text);
}
catch (NumberFormatException ex) {
//define here which number should be shown when input is incorrect. e.g. p=0;
}
当无法正确解析源值时,可以包装值解析并提供适当的输出
当无法正确解析源值时,可以包装值解析并提供适当的输出
当无法正确解析源值时,可以包装值解析并提供适当的输出
当源值无法正确解析时,您可以包装值解析并提供适当的输出。您得到的是NumberFormatException
,因为当您清除字段中的文本时,没有任何内容无法转换为数字,因此需要检查字段是否为空
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
正如我在评论中所指出的,对于链接,只需使用DocumentFilter
仅允许数字
下面是代码的重构。它在没有NumberFormatException
的情况下工作。我添加了DocumentFilter
import java.awt.GridLayout;
import javax.swing.*;
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.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class TestLabelMirror {
private JPanel mainPanel = new JPanel();
private JTextField field = new JTextField(20);
private JTextField field1 = new JTextField(20);
private JFrame frame;
public TestLabelMirror() {
field.getDocument().addDocumentListener(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) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
String text = field.getText();
String text1 = field1.getText();
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
}
});
}
});
((AbstractDocument) field.getDocument()).setDocumentFilter(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
}
});
mainPanel.setLayout(new GridLayout(1, 0, 10, 0));
mainPanel.add(field);
mainPanel.add(field1);
}
public JComponent getComponent() {
return mainPanel;
}
private static void createAndShowUI() {
JFrame frame = new JFrame("TextLabelMirror");
frame.getContentPane().add(new TestLabelMirror().getComponent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
}
您将获得NumberFormatException
,因为当您清除字段中的文本时,没有任何内容无法转换为数字,因此需要检查该字段是否为空
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
正如我在评论中所指出的,对于链接,只需使用DocumentFilter
仅允许数字
下面是代码的重构。它在没有NumberFormatException
的情况下工作。我添加了DocumentFilter
import java.awt.GridLayout;
import javax.swing.*;
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.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class TestLabelMirror {
private JPanel mainPanel = new JPanel();
private JTextField field = new JTextField(20);
private JTextField field1 = new JTextField(20);
private JFrame frame;
public TestLabelMirror() {
field.getDocument().addDocumentListener(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) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
String text = field.getText();
String text1 = field1.getText();
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
}
});
}
});
((AbstractDocument) field.getDocument()).setDocumentFilter(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
}
});
mainPanel.setLayout(new GridLayout(1, 0, 10, 0));
mainPanel.add(field);
mainPanel.add(field1);
}
public JComponent getComponent() {
return mainPanel;
}
private static void createAndShowUI() {
JFrame frame = new JFrame("TextLabelMirror");
frame.getContentPane().add(new TestLabelMirror().getComponent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
}
您将获得NumberFormatException
,因为当您清除字段中的文本时,没有任何内容无法转换为数字,因此需要检查该字段是否为空
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
正如我在评论中所指出的,对于链接,只需使用DocumentFilter
仅允许数字
下面是代码的重构。它在没有NumberFormatException
的情况下工作。我添加了DocumentFilter
import java.awt.GridLayout;
import javax.swing.*;
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.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class TestLabelMirror {
private JPanel mainPanel = new JPanel();
private JTextField field = new JTextField(20);
private JTextField field1 = new JTextField(20);
private JFrame frame;
public TestLabelMirror() {
field.getDocument().addDocumentListener(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) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
String text = field.getText();
String text1 = field1.getText();
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
}
});
}
});
((AbstractDocument) field.getDocument()).setDocumentFilter(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
}
});
mainPanel.setLayout(new GridLayout(1, 0, 10, 0));
mainPanel.add(field);
mainPanel.add(field1);
}
public JComponent getComponent() {
return mainPanel;
}
private static void createAndShowUI() {
JFrame frame = new JFrame("TextLabelMirror");
frame.getContentPane().add(new TestLabelMirror().getComponent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
}
您将获得NumberFormatException
,因为当您清除字段中的文本时,没有任何内容无法转换为数字,因此需要检查该字段是否为空
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
正如我在评论中所指出的,对于链接,只需使用DocumentFilter
仅允许数字
下面是代码的重构。它在没有NumberFormatException
的情况下工作。我添加了DocumentFilter
import java.awt.GridLayout;
import javax.swing.*;
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.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class TestLabelMirror {
private JPanel mainPanel = new JPanel();
private JTextField field = new JTextField(20);
private JTextField field1 = new JTextField(20);
private JFrame frame;
public TestLabelMirror() {
field.getDocument().addDocumentListener(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) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
String text = field.getText();
String text1 = field1.getText();
if (!text.isEmpty()) {
int p = Integer.parseInt(text);
int i = (p * 5);
String s = String.valueOf(i);
field1.setText(s);
} else {
field1.setText(null);
}
}
});
}
});
((AbstractDocument) field.getDocument()).setDocumentFilter(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
}
});
mainPanel.setLayout(new GridLayout(1, 0, 10, 0));
mainPanel.add(field);
mainPanel.add(field1);
}
public JComponent getComponent() {
return mainPanel;
}
private static void createAndShowUI() {
JFrame frame = new JFrame("TextLabelMirror");
frame.getContentPane().add(new TestLabelMirror().getComponent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
}
你能发布一个我们可以测试的吗?你还想实现一个DocumentFilter
只接受数字,如图所示,下面是完整的代码:你能发布一个我们可以测试的吗?你还想实现一个DocumentFilter
只接受数字,如图所示,这是complie的完整代码:你能发布一个我们可以测试的吗?你还想实现一个DocumentFilter
来只接受数字,如图所示,这是complie的完整代码:你能发布一个我们可以测试的吗?你还想实现一个DocumentFilter
来只接受数字,如图所示,这里是complie的完整代码:它刚刚工作。谢谢但是请帮助我如何允许“.”和整数@StanislavLYou可以定义允许和字符列表“+-.0123456789”,并检查是否注册了允许的字符。我建议使用正则表达式(参见示例),因为它刚刚起作用。谢谢但是请帮助我如何允许“.”和整数@StanislavLYou可以定义允许和字符列表“+-.0123456789”,并检查是否注册了允许的字符。我建议使用正则表达式(参见示例),因为它刚刚起作用。谢谢但是请帮助我如何允许“.”和整数@StanislavLYou可以定义允许和字符列表“+-.0123456789”,并检查是否注册了允许的字符。我建议使用正则表达式(参见示例),因为它刚刚起作用。谢谢但是请帮助我如何允许“.”和整数@StanislavLYou可以定义允许和字符列表“+-.0123456789”,并检查是否注册了允许的字符。我建议使用正则表达式(参见示例),感谢它工作良好,但您能帮助我如何允许“.”和整数一起使用吗@你找到什么了吗@peeskilletI昨天在工作。我过一会儿再去看看。我会让你知道的。谢谢,它工作得很好,但你能帮我如何允许“.”和整数一起使用吗@你找到什么了吗@peeskilletI昨天在工作。我过一会儿再去看看。我会让你知道的。谢谢,它工作得很好,但你能帮我如何允许“.”和整数一起使用吗@你找到什么了吗@peeskilletI昨天在工作。我过一会儿再去看看。我会让你知道的。谢谢,它工作得很好,但你能帮我如何允许“.”和整数一起使用吗@你找到什么了吗@peeskilletI昨天在工作。我过一会儿再去看看。我会让你知道的。