【问题标题】:Don't know how to fix my PropertyChangeListener on a JFormattedTextField不知道如何在 JFormattedTextField 上修复我的 PropertyChangeListener
【发布时间】: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


【解决方案1】:

你肯定知道evt.getNewValue()返回的对象是Number对象。如果您利用这些信息来发挥自己的优势并尝试以下方式会怎样:

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

【讨论】:

  • 亲爱的,你是我的救星。谢谢,一旦我被允许,您将标记为已回答
猜你喜欢
  • 2021-06-19
  • 2014-04-15
  • 2017-01-11
  • 2016-10-07
  • 2023-04-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多