gpt4 book ai didi

java - 使用文档监听器将 jtextfield 值同步为仅整数值

转载 作者:行者123 更新时间:2023-12-01 23:12:20 24 4
gpt4 key购买 nike

按照问题Synchronize JTextField values by property change listener

我尝试使用文档监听器修改答案中的示例。我想要修改的是仅同步整数。例如,如果我在 field1 中输入“2”,那么它将乘以“5”,这样 field2 中的值将是“10”。但是,我遵循了各种方法,但遇到了一些错误,例如:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""

此外,当我删除 field1 中的所有值时,最后同步的 field2 值仍然保留,而 field2 也应该像 field1 一样为 null。我不确定我在哪一部分犯了错误。这是我的 UpdateLabel 方法的代码示例:

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 错误消息。

最佳答案

当您清除字段中的文本时,您会收到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();
}
});
}
}

关于java - 使用文档监听器将 jtextfield 值同步为仅整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21702573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com