如何修复将 Jlabel 更改为有效值的按键功能
how to fix key pressed function for changing Jlabel into valid values
我正在处理转换度数,一旦用户在文本字段中输入值并指出需要哪个度数,就会出现带有输出结果的输入,而不是之前的标签。
此处为文本字段中仅用于数字的字母输入的格式限制部分
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 键;他们要求键是 ENTER, 或 单选按钮之一(角度或弧度)被选中。
综上所述……没关系,因为您不应该为此使用 KeyListener。通常,您通过 adding an ActionListener, but JFormattedTextField has a better way, which monitors not only Enter but also loss of focus: the documentation for JFormattedTextField’s value property states that it is a bound property, which means you can listen to changes 在 属性:
中检查用户在 JTextField 中按下 Enter
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 + " °");
}
}
}
});
我正在处理转换度数,一旦用户在文本字段中输入值并指出需要哪个度数,就会出现带有输出结果的输入,而不是之前的标签。 此处为文本字段中仅用于数字的字母输入的格式限制部分
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 键;他们要求键是 ENTER, 或 单选按钮之一(角度或弧度)被选中。
综上所述……没关系,因为您不应该为此使用 KeyListener。通常,您通过 adding an ActionListener, but JFormattedTextField has a better way, which monitors not only Enter but also loss of focus: the documentation for JFormattedTextField’s value property states that it is a bound property, which means you can listen to changes 在 属性:
中检查用户在 JTextField 中按下 EnterformattedTextField.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 + " °");
}
}
}
});