我正在为朋友开发一个项目,一个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;
}