每当我试图编译程序时,我都会得到错误"在封闭范围中定义的局部变量迭代必须是最终的或实际上是最终的";。有人知道怎么解决这个问题吗?代码还没有完成,所以有些东西可能看起来不合适。
public static void go(purchase joe) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SpinnerNumberModel NumberImput =
new SpinnerNumberModel(1.00,0.00,null,1.00);
int iteration = 0;
JSpinner spinner = new JSpinner(NumberImput);
JLabel label = new JLabel("Please enter the price of the Item.");
JButton button = new JButton("Press here to continue");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
switch (iteration) {
case 0:
joe.setPrice((double)NumberImput.getNumber());
label.setText("Plese enter the amount that you are buying");
NumberImput.setValue(1.00);
iteration += 1;
break;
case 1:
joe.setAmount((int)NumberImput.getNumber());
label.setText("Plese enter the amount that you are buying");
break;
}
}
});
frame.setLayout(new FlowLayout());
frame.add(label);
frame.add(spinner);
frame.add(button);
frame.setSize(600, 500);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
joe.setPrice((double)NumberImput.getNumber());
}
您正在使用iteration += 1;
。这是对局部变量的赋值。现在ActionListener对象的寿命比本地变量长;actionPerformed可以在方法的调用消失后调用。
出于这个原因,Java虚拟机向ActionListener添加了一个新的变量iteration
,一个副本。为了防止分配给局部变量iteration
会使其他iteration
过时,该语言决定局部变量必须是常量,而不是分配给";实际上是最终的">
AtomicInteger iteration = new AtomicInteger();
... iteration.getAndIncrement();
但是,当稍后调用actionPerformed
时,只需删除iteration
即可。您可以在ActionListener中使用字段。
button.addActionListener(new ActionListener() {
int iter;
@Override
public void actionPerformed(ActionEvent e) {
switch (iter) {
case 0:
joe.setPrice(NumberImput.getNumber().doubleValue());
label.setText("Please enter the amount that you are buying");
NumberImput.setValue(1.00);
iter++;
break;
case 1:
joe.setAmount(NumberImput.getNumber().intValue());
label.setText("Please enter the amount that you are buying");
break;
}
}
});
打开样式:始终使用@Override
,因为在类似情况下会捕捉到打字错误。
@Override
public void actionPerformed(ActionEvent e){
使用numberInput
;以小写字母开头的变量、字段和方法。