在帖子末尾进行编辑
测试代码和输出
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/