下面的问题是通过属性更改侦听器同步JTextField值
我尝试使用document listener从答案中修改示例。我想修改的是只同步整数。例如,如果我在字段1中输入'2',那么它将乘以'5',因此字段2中的值将为'10'。然而,我遵循了各种方法,但我有一些错误,例如:
java线程“AWT-EventQueue-0”中出现异常。lang.NumberFormatException:用于输入字符串:“”
此外,当我从field1中删除所有值时,最后一个同步的field2值保持不变,而field2也应该作为field1为空。我不确定我犯了什么错误。以下是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
错误消息。
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();
}
});
}
}
问题内容: 我希望在用户更改文本字段中的值后立即显示消息框。目前,我需要按Enter键才能弹出消息框。我的代码有什么问题吗? 任何帮助,将不胜感激! 问题答案: 将侦听器添加到为你自动创建的基础文档中。
问题内容: 我希望消息框在用户更改文本字段中的值后立即显示。目前,我需要按Enter键才能弹出消息框。我的代码有什么问题吗? 任何帮助,将不胜感激! 问题答案: 将侦听器添加到为您自动创建的基础文档中。
在我的代码中,如果用户在ComboBox 2中输入值,它将反映在TextField中,但是如果用户从ComboBox 1的下拉列表中选择,而不更改ComboBox 2中的值,那么TextField中的值将保持不变,它不会更改。我做错了吗? 测试2。txt:1任何帮助都将不胜感激!
问题内容: 假设我想基于整数id值进行锁定。在这种情况下,有一个函数可从缓存中提取一个值,如果该值不存在,则会进行相当昂贵的检索/存储到缓存中。 现有代码不同步,并且可能触发多个检索/存储操作: 我想做的是同步ID上的检索,例如 不幸的是,这是行不通的,因为两个单独的调用可以具有相同的Integer id值,但是可以具有不同的Integer对象,因此它们将不会共享锁,并且不会发生同步。 有没有一种
问题内容: 我下面发布的示例代码显示了两个类。一个实现KeyListener,另一个实现Runnable,并在每20 ms休眠的无限循环中运行。当按下键时,采用int形式的keyChar用作索引,设置布尔数组的索引true或false,表示是否按下了该键。同时,过程循环正在键数组中搜索其true或false值,并将true设置为false,然后打印出char。我的问题是我是否需要使用带锁的同步来访
问题内容: 所以我有 但是我想传递tabChange事件和页面上存储的额外值 人们将如何去做呢? 问题答案: 您可以在bean中用其他属性替换参数,并在ajax请求中将此属性设置所需的值: 请参阅setPropertyActionListener