java - 不知道如何修复 JFormattedTextField 上的 PropertyChangeListener

标签 java swing listener jformattedtextfield propertychangelistener

在帖子末尾进行编辑

测试代码和输出

import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.text.NumberFormatter;

public class Test{
    private JFormattedTextField input, input2;
    private NumberFormatter formatter;
    private PropertyChangeListener listener;
    
    
    public Test(){
       formatter = new NumberFormatter(NumberFormat.getNumberInstance());
       input = new JFormattedTextField(formatter);
       input2 = new JFormattedTextField(formatter);
       listener = new PropertyChangeListener(){
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                convert(evt);
            }
        };
       input.setColumns(4);
       input2.setColumns(4);
       input.addPropertyChangeListener("value", listener);
       input2.addPropertyChangeListener("value", listener);
       input.setValue(0.0);
       JPanel panel = new JPanel();
       panel.add(input);
       panel.add(input2);
       
       
       JOptionPane.showMessageDialog(null, panel);
    }
    
    private void convert(PropertyChangeEvent evt){
        if (evt.getSource()== input){
            if (evt.getSource()!= null){
                double temp;
                temp = converter((Double)evt.getNewValue());
                input2.setValue(temp);
            }
            
        }
        
        
    }
    
    public static void main(String[] args) {
        
        EventQueue.invokeLater(new Runnable(){
           public void run(){
              new Test(); 
           } 
        });
        
    }
    
    private double converter(double value){
        value = value*2;
        
        return value;
    }
    
}

堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
        at test.Test.convert(Test.java:46)

我的想法

因为我有一个传入 double 的方法(它是 convert()),并且看似 evt.getNewValue() 返回直接值,在输入时从技术上讲是一个long,它会抛出该错误。

但是每次解析我的evt.getNewValue()为 double 的尝试都没有成功。也许了解一下我想用这个程序做什么会有所帮助。


该计划的用途

所以我有一个 JPanel (在 tabbedPane 中),它有两个 JFormattedTextField 输入。这是一个转换应用程序。我的转换类方法传入一个double并返回一个double。我希望将这些字段链接在一起,或者换句话说,一旦一个字段的输入发生更改,其他字段也会随之更改(就像转换的输出一样)。

我正在考虑废弃 PropertyChangListener 并改用 DocumentListener,但选择先尝试前者,因为后者有 3 个可重写我必须注意的方法,其中之一可能会导致一些意外结果(例如,突出显示和删除字段会触发两个事件)。


TL;博士:

是否有更好的方法来获取动态更新的双输入字段应用程序?在一个字段中输入一个数字,另一字段的数字会自动更新。

还是 Java 新手。


编辑1

我找到了一个临时解决方案:将 DecimalFormat 作为 JFormattedTextField 中的格式。但如果它也能在没有小数的情况下工作,我会喜欢它。

编辑2

问题已回答,没有意识到 evt.getNewValue() 返回一个 Number 实例。

最佳答案

您可以确定的是,evt.getNewValue() 返回的对象是一个 Number 对象。如果您利用这些信息来发挥自己的优势并尝试按照以下方式进行操作会怎样:

temp = ((Number)evt.getNewValue()).doubleValue();

关于java - 不知道如何修复 JFormattedTextField 上的 PropertyChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22776172/

相关文章:

java - 使用用户名引用将数据保存到 Firebase

java - Java 的 GridBagConstraints

java - 使用监听器从 httpURLConnection 检索数据

java - 将对象作为参数传递给其他对象 - null

java - 使用 Java 对 Javascript 进行静态分析

java - JMX 与 VisualVM?

java - JPanel SetPreferedSize 与实际大小不匹配

java - Swing:JDialogs 如何与 JFrame 对话

android - 处理可扩展 ListView 中包含多个 View 的 subview 上的单击事件

android - 根据 fragment 可见性自动禁用/启用监听器