как использовать для цикла Varaible в действии слушателя - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь использовать цикл for для генерации и добавления ActionListeners для jButtons вместе с некоторым необычным редактированием массива и захватом произвольного массива

при этом используется некоторая пользовательская функция (все из которых работают)

for(int i = 0; i < data.length; i++){
     //make new jButton with function button to set it up
     JButton newGenButton = button(0, (i+1)*20, 100, (i+2)*20,data[i][0][1]);
     //add action listner
     newGenButton.addActionListener(
     new ActionListener(){  
        public void actionPerformed(ActionEvent e){ 
           //empty string
           String gen = "";
           //this gets the name (data[i][i2][0]) and uses the ran function to get another random string from the array (data[i][i2])
           for(int i2 = 1; i2 < data.length; i2++){
              gen+= data[i][i2][0]+": "+ran(data[i][i2])+"\n\n";
           }
           //this add the text to pre-defined JTextArea
           text.setText(gen);
        }  
     });
  }

справочные функции здесь, если это полезно

  private static JButton button(int x1, int y1, int x2, int y2, String text){
     JButton newButton = new JButton(text);
     newButton.setBounds(x1,y1,x2-x1,y2-y1);
     dp("button \""+text+"\" built");
     return newButton;
  }
  private static String ran(String[] input) {
     return input[1+rand.nextInt(input.length-1)];
  }

при попытке компиляции я сталкиваюсь с ошибкой

Main.java:127: error: local variables referenced from an inner class must be final or effectively final
gen+= data[i][i2][0]+": "+ran(data[i][i2])+"\n\n";
           ^

по сути, мне нужен способ получитьслушатель действия знает значение, которым является int i, или просто знает, какие данные [i] [] [] (которые различны для каждой кнопки)

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете извлекать ActionListener снаружи как класс, что-то вроде строк:

private static class MyActionListener implements ActionListener {

        private int i;

        MyActionListener(int i) {
            this.i = i;
        }

        @Override
        public void actionPerformed(ActionEvent actionEvent) {

        }
    }

Теперь, когда вы добавляете actionListener к кнопке, создайте экземпляр этого класса, передав значение i в конструкторе. Логика вашего actionPerformed остается прежней. При добавлении actionListener просто сделайте следующее: newGenButton.addActionListener(new MyActionListener(i));

...