Преминаване през масив от възли за добавяне на MouseEvent, което засяга външна променлива

Имам списък с масиви от HBox възли, които трябва да работят нещо като набор от радио бутони. Щракването върху който и да е от възлите ще актуализира int стойност, съответстваща на позицията на кликнатия възел в масива.

Това е списък с масиви, тъй като броят на възлите на HBox трябва да бъде динамичен и определен по време на изпълнение въз основа на аргументи. Всеки HBox е идентичен по формат, но съдържанието на етикетите вътре е уникално.

Преминаването през arraylist (arrayOfHBox) за добавяне на събитие с щракване на мишката към всеки възел създава проблема с вътрешните класове, които не приемат некрайни променливи (така че вътре в събитието на мишката не мога да разбера на коя позиция от масива съм). Разбирам причините, поради които това трябва да се случи, но не съм сигурен за алтернативен подход, за да го заобиколя.

int selectedIndex=-1; //the int to determine which "radio button" HBox is clicked

for (int i=0;i<arrayOfHBox.size();i++)
{
    arrayOfHBox.get(i).addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() 
    {
        @Override
        public void handle(MouseEvent event) 
        {
            selectedIndex=i;  //Won't compile
            event.consume();
        }
    });
}

Въпросът тогава: има ли начин да се добавят манипулатори на мишката към всички възли на HBox, където всеки ще зададе външна променлива, равна на позицията на кликнатия възел в масива?


person Prester    schedule 13.08.2015    source източник


Отговори (1)


Тогава e. ж. използвайте крайна междинна променлива като

int selectedIndex=-1; //the int to determine which "radio button" HBox is clicked

for (int i=0;i<arrayOfHBox.size();i++)
{

    final int index = i;
    arrayOfHBox.get(i).addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() 
    {
        @Override
        public void handle(MouseEvent event) 
        {
            selectedIndex=index;  //Won't compile
            event.consume();
        }
    });
}

или работете на ниво обект, използвайте event.getSource(), за да определите източника и изберете hbox като елемент от arraylist.

person Roland    schedule 13.08.2015
comment
Благодаря ви за решението, сработи чудесно. Не знаех, че мога да използвам крайни променливи в for цикъл, така че направих бързо търсене в него и намерих тази тема, която може да бъде от някаква помощ за други, любопитни как работи крайна променлива в обхват, какъвто бях аз. - person Prester; 13.08.2015