如何修复将Jlabel更改为有效值的按键功能

时间:2019-04-21 15:02:16

标签: java swing keypress

我正在使用转换度,一旦用户在文本字段中输入值指出所需的度,则应显示具有输出结果的输入,而不是之前的标签。    这里是关于仅在文本字段中输入数字的字母格式限制的部分

        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 + " °");
        }
      }
    }

1 个答案:

答案 0 :(得分:1)

问题是您使用的是||(或)而不是&&(和)。您的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 + " °");
                }
            }
        }
    });