Mac OS上的JFormattedTextField不会更改值

时间:2017-09-20 10:46:44

标签: java windows macos swing jformattedtextfield

我正在为朋友开发一个项目,一个Java Swing程序。现在我已经完成了管理模式,可以添加要出售的商品并更改收银机中的货币价值。

为此,我添加了JFormattedTextField。左侧的值是现金箱中的当前金额,正确的金额是此“管理会话”之后的金额,中间的金额是差价。 我已将Property Change Listener添加到差异和新值框中,当前框不可编辑。 当我更改右框时,为了在会话后获得新值, propertyChange 函数计算差异,当我更改差异以添加或移除金额时,新金额将被计算。

我正在使用Windows 10,它的工作正常,正如预期的那样。但对于我的好友,谁在Mac OS上,如果他在两个字段中的任何一个字段中输入新值,它既不会改变当前值也不会改变另一个字段的值。他也不能以任何方式接受Enter输入。 他还尝试了一个Windows虚拟机(XP,我认为),其中至少文本字段工作并通过按Tab键更改值,但输入仍然无效。

我想这不是我的代码直接问题,但无法查明问题的根源。由于我没有Mac,很难调试这个问题。 这可能是什么问题,我该如何解决/避免这种情况?

修改:示例窗口的代码

import java.awt.FlowLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import javax.swing.*;
import javax.swing.text.*;


public class Example extends javax.swing.JFrame implements PropertyChangeListener{

    public Example() {
        NumberFormat amountFormat = NumberFormat.getCurrencyInstance();
        NumberFormatter aFF = new NumberFormatter(amountFormat);
        DefaultFormatterFactory factory = new DefaultFormatterFactory(aFF);

        jLabel1 = new JLabel();
        jLabel1.setText("Old:");

        oldCashText = new JFormattedTextField();
        oldCashText.setEditable(false);
        oldCashText.setValue((float) 15);
        oldCashText.setFormatterFactory(factory);

        jLabel2 = new JLabel();
        jLabel2.setText("Difference:");

        differenceCashText = new JFormattedTextField();
        differenceCashText.setValue(differenceCash);
        differenceCashText.addPropertyChangeListener("value", this);
        differenceCashText.setFormatterFactory(factory);

        jLabel3 = new JLabel();
        jLabel3.setText("New:");

        newCashText = new JFormattedTextField();
        newCashText.setValue(newCash);
        newCashText.addPropertyChangeListener("value", this);
        newCashText.setFormatterFactory(factory);

        FlowLayout layout = new FlowLayout();
    this.setLayout(layout);

    this.add(jLabel1);
        this.add(oldCashText);
        this.add(jLabel2);
        this.add(differenceCashText);
        this.add(jLabel3);
        this.add(newCashText);

        pack();
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        Object source = evt.getSource();
        if(source == differenceCashText){
            newCash = ((Number)differenceCashText.getValue()).floatValue() + 
                    ((Number)oldCashText.getValue()).floatValue();
            newCashText.setValue(newCash);
        }
        if(source == newCashText){
            differenceCash = ((Number)newCashText.getValue()).floatValue() - 
                    ((Number)oldCashText.getValue()).floatValue();
            differenceCashText.setValue(differenceCash);
        }

    }                   



    private javax.swing.JFormattedTextField differenceCashText;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JFormattedTextField newCashText;
    private javax.swing.JFormattedTextField oldCashText;

    private float newCash = 0;
    private float differenceCash = 0;
}

0 个答案:

没有答案