我需要在javafx的lambda事件处理程序中更改局部变量。

SerialPort comPorts[] = SerialPort.getCommPorts();
MenuItem[] portsItems = new MenuItem[10];
int q=0;
   for (SerialPort port : comPorts) {
       portsItems[q] = new MenuItem(port.getSystemPortName());
       portsItems[q].setOnAction(actionEvent -> {
               portNum = q;
               connect.setDisable(false);
       });
       comPortsMenu.getItems().add(portsItems[q]);
   }


问题是我需要在每个循环中增加q,但是我不能这样做,因为q必须是final或有效地final才能在lambda中使用。

最佳答案

我认为您正在寻找类似的东西

for (SerialPort port : comPorts) {
    portsItems[q] = new MenuItem(port.getSystemPortName());
    int portNumber = q ; // effectively final
    portsItems[q].setOnAction(actionEvent -> {
        portNum = portNumber;
        connect.setDisable(false);
    });
    comPortsMenu.getItems().add(portsItems[q]);

    // increment:
    q++ ;
}

07-26 06:22