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

问题描述 投票:0回答:1

我正在使用转换度,一旦用户在文本字段中输入值指出需要哪个度,输出结果应该出现而不是之前的标签。此处部分用于格式化仅对文本字段中的数字输入的字母的限制

        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 + " °");
        }
      }
    }
java swing keypress
1个回答
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 + " °");
                }
            }
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.