public Monster createCharacterScene() {
    String name;
    TextField nameTextField = new TextField();
    nameTextField.setLocation(65, 50);
    nameTextField.setSize(60, 10);
    Button myButton = new Button("OK");
    myButton.setLocation(25, 50);
    myButton.setSize(30, 40);
    add(myButton);
    add(nameTextField);
    myButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            name = nameTextField.getText();
        }
    });
    return null;
}

No puedo hacerlo así. Dicen que "las variables locales referenciadas desde una clase interna deben ser finales o efectivamente finales". ¿Existe una forma alternativa de hacerlo?

Muchas gracias.

PD. Estoy usando applet.

0
Pakanon Pantisawat 15 nov. 2017 a las 15:09

2 respuestas

La mejor respuesta

No puede leer este valor directamente en el método createCharacterScene(). Porque aún se desconoce. Lo único que puede hacer es definir un eventHandler, que se activará al presionar una tecla.

Consumer<String> nameConsumer = text -> { /*You will handle event here*/};
myButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            nameConsumer.apply(nameTextField.getText());
        }
    });

La versión más barata sería utilizar una pequeña solución para el modificador final:

final String[] nameHolder = new String[1];
myButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            nameHolder[0] = nameTextField.getText();
        }
    });

Aquí nameHolder inicialmente se mantendrá nulo, pero cuando alguien active el evento, se establecerá su valor, por lo que debe verificar si el valor está establecido o no.

0
Beri 15 nov. 2017 a las 12:17

Haz de name una pseudo-final:

  final String[] name = new String[1];

Y accede a él de esta manera:

 name[0] = nameTextField.getText();
0
мυѕτавєւмo 15 nov. 2017 a las 12:14