如何修复将 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 + " °");
                }
            }
        }
    });