我正在使用转换度,一旦用户在文本字段中输入值指出需要哪个度,输出结果应该出现而不是之前的标签。此处部分用于格式化仅对文本字段中的数字输入的字母的限制
NumberFormat format = NumberFormat.getInstance();
NumberFormatter formatter = new NumberFormatter(format);
formatter.setValueClass(Double.class);
formatter.setMinimum(Double.MIN_VALUE);
formatter.setMaximum(Double.MAX_VALUE);
formatter.setAllowsInvalid(false);
formatter.setCommitsOnValidEdit(true);
formattedTextField = new JFormattedTextField(formatter);
formattedTextField.setColumns(10);
}
这里的问题
public void keyPressed(KeyEvent e){
double degree;
if (Angle.isSelected()||e.getKeyChar()==KeyEvent.VK_ENTER){
degree = Math.toDegrees((double)formattedTextField.getValue());
resultLabel.setText(formattedTextField.getValue()
+ " ° = "+ degree + " radians");
}else if(Radians.isSelected()||e.getKeyChar()==KeyEvent.VK_ENTER){
degree = Math.toRadians((double) formattedTextField.getValue());
resultLabel.setText(formattedTextField.getValue() +
" radians = " + degree + " °");
}
}
}
问题是你使用的是||
(或)而不是&&
(和)。你的if
测试不需要按下键进入;它们要求键为ENTER,或者选择其中一个单选按钮(角度或弧度)。
所有这一切......没关系,因为你不应该为此使用KeyListener。通常,您检查用户是否按adding an ActionListener在JTextField中按Enter键,但JFormattedTextField有更好的方法,它不仅监视Enter而且还监视焦点丢失:the documentation for JFormattedTextField’s value property声明它是绑定属性,这意味着您可以在该属性中使用listen to changes :
formattedTextField.addPropertyChangeListener("value",
new PropertyChangeListener() {
@Override
public void propertyChangeEvent(PropertyChangeEvent event) {
Double newValue = (Double) event.getNewValue();
if (newValue != null) {
if (angle.isSelected()) {
double radians = Math.toRadians(newValue);
resultLabel.setText(
newValue = + " ° = " + radians + " radians");
} else {
double degree = Math.toDegrees(newValue);
resultLabel.setText(
newValue + " radians = " + degree + " °");
}
}
}
});