不知道如何在JFormattedTextField上修复我的PropertyChangeListener

时间:2014-04-01 03:19:01

标签: 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()返回直接值,在输入时技术上是{{1它会抛出那个错误。

但是long parsingevt.getNewValue()的所有尝试都没有奏效。也许对我正在尝试用这个程序做些什么的一点知识会有所帮助。


该计划适用于

所以我有一个JPanel(在tabbedPane中)有两个JFormattedTextField输入。这是一个转换应用程序。我的转化class method传入double并返回double。我希望将字段链接在一起,换句话说,只要一个字段的输入被更改,另一个字段的输入就会被更改(就像它是转换的输出一样)。

我正在考虑取消PropertyChangListener并转而使用DocumentListener,而是选择尝试前者,因为后者有3 overrideable methods我必须采取照顾,其中一个可能会导致一些意想不到的结果(例如,突出显示和删除字段会触发两个events


TL; DR:

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

仍然是Java的新手。


EDIT1

我找到了一个临时解决方案:DecimalFormat格式为JFormattedTextField。但是,如果它没有小数也可以工作,我会喜欢它。

EDIT2

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

1 个答案:

答案 0 :(得分:2)

您确定知道的是evt.getNewValue()返回的对象是Number对象。如果您使用这些信息对您有利并尝试这些方法,那该怎么办:

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