【发布时间】:2014-04-01 03:19:00
【问题描述】:
在文章末尾编辑
测试代码和输出
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,所以它抛出了那个错误。
但是parsing 我的evt.getNewValue() 的每一次尝试都没有成功。也许对我想用这个程序做什么有一点了解会有所帮助。
该计划的用途
所以我有一个JPanel(在tabbedPane 中),它有两个JFormattedTextField 输入。这是一个转换应用程序。我的转换class method 传入double 并返回double。我希望将字段链接在一起,或者换句话说,只要一个字段的输入发生更改,其他字段就会随之更改(就像它是转换的输出一样)。
我正在考虑放弃 PropertyChangListener 并改用 DocumentListener,但选择先尝试前者,因为后者有 3 个 overrideable methods 我必须照顾,其中一个可能会导致一些意想不到的结果(例如高亮和删除字段会触发两个events)。
TL;DR:
有没有更好的方法来获得动态更新的双输入字段应用程序?在一个字段中输入一个数字,另一个字段的数字会自动更新。
仍然是 Java 新手。
编辑1
我找到了一个临时解决方案:将DecimalFormat 作为JFormattedTextField 中的格式。但如果它可以在没有小数的情况下工作,我会喜欢它。
编辑2
已回答问题,没有意识到 evt.getNewValue() 正在返回 Number 实例。
【问题讨论】:
-
as soon as one field's input is changed the other changes with it- 只有在格式化文本字段上提交更改时才会触发 PropertyChangeListener。因此,DocumentListener 将是更好的选择,因此更改会在您键入时发生。多个事件不是问题 -
@camickr 也正要问这个问题。现在它实际上会立即更新,但仅限于第一个焦点以及我添加数字时。否则我必须失去对该领域的关注才能更新另一个领域。会尝试一个文档监听器,不过谢谢。
-
@camickr 好的,所以我尝试使用文档侦听器。它只会在失去焦点的情况下更新,所以它甚至不是我想要的。我会摆弄它,看看我能不能解决这个问题。
-
DocumentListener 作用于我输入的每个字符。您只需要处理
insertUpdate()和removeUpdate()事件。changeEvent()用于属性更改,不适用于文本字段。 -
@camickr 它有效,但前提是我从文本字段更改焦点。我不知道为什么,我已经让 oracles 演示文档侦听器完全按照我希望我的程序工作,但我的程序不会这样做。
标签: java swing listener jformattedtextfield propertychangelistener