setOnAction限制和datepicker类

时间:2018-07-31 03:57:24

标签: date javafx datepicker

我正在编写一个涉及时差的应用程序,有些东西我不明白,

    final DatePicker datePick=new DatePicker();
    LocalDate time;
    Label label=new Label();
    datePick.setOnAction(new EventHandler<ActionEvent>(){
        public void handle(ActionEvent e){
            time=datePick.getValue();//doesn't work, must 'LocalDate time=datePick.getValue();
            label.setText(time);//doesn't work must label.setText("Time now:"+time)
        }
    });

它给出一个错误,指出“从内部类引用的局部变量必须是最终的或有效的”,无论如何,我所做的就是在setOnAction()中声明'time'变量,并且它起作用了,那么怎么了?和'label.setText(time);'如果我没有在其中写一些文本,例如'label.setText(“ Time now:” + time);“ ,也不会工作,那很奇怪,为什么呢?

1 个答案:

答案 0 :(得分:2)

Java将您从匿名类/ lambda表达式访问的局部变量限制为在赋值后永不更改其值的变量(即,如果您将其声明为final,则编译器不会抱怨这些变量)。如果您可以从匿名类中写入局部变量,则将违反此条件。由于这个原因,不可能从匿名类中写入包含方法的局部变量。

您应该在仍然需要它们的范围内声明变量。

关于label.setText(time);

Label.setText是带有String参数的方法。由于String不是LocalDate的超类型,因此简单的分配将不起作用。您需要将日期转换为String。字符串串联会自动执行此操作,即+运算符接收String s作为第一操作数,而Object o作为第二操作数输出sObjects.toString(o)的串联。

您可以自己转换为字符串:

label.setText(Objects.toString(time, ""));

或者使用更复杂的方法转换为字符串。