簡體   English   中英

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

[英]Don't know how to fix my PropertyChangeListener on a JFormattedTextField

在帖子末尾編輯

測試代碼和輸出

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() parsing為 double 的嘗試都沒有奏效。 也許對我試圖用這個程序做的事情有一點了解會有所幫助。


該計划的用途

所以我有一個JPanel (在tabbedPane ),它有兩個JFormattedTextField輸入。 這是一個轉換應用程序。 我的轉換class method傳入一個double並返回一個double 我希望將字段鏈接在一起,或者換句話說,只要一個字段的輸入發生更改,其他字段也會隨之更改(因為它是轉換的輸出)。

我正在考慮取消PropertyChangListener並改用DocumentListener ,但選擇先嘗試前者,因為后者有 3 個我必須處理的可overrideable methods ,其中一個可能會導致一些意外結果(突出顯示和刪除該字段會觸發例如兩個events )。


特爾;博士:

有沒有更好的方法來獲得動態更新的雙輸入字段應用程序? 在一個字段中輸入一個數字,另一個字段的數字會自動更新。

仍然是 Java 的新手。


編輯1

我找到了一個臨時解決方案:將DecimalFormat作為JFormattedTextField的格式。 但如果它也可以在沒有小數的情況下工作,我會喜歡它。

編輯2

問題已回答,沒有意識到evt.getNewValue()正在返回一個Number實例。

您所知道的只是evt.getNewValue()返回的對象是一個Number對象。 如果您利用這些信息來發揮自己的優勢,並按照以下方式進行嘗試會怎樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM