当前位置: 首页 > 知识库问答 >
问题:

使用文档侦听器将jtextfield值同步为唯一整数值

翟丰茂
2023-03-14

下面的问题是通过属性更改侦听器同步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错误消息。

共有2个答案

邬阳
2023-03-14
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;
}

您可以对值解析进行包装,并在无法正确解析源值的情况下提供适当的输出。

国盛
2023-03-14

您将获得数字格式异常(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