Перебор массива узлов для добавления события MouseEvent, влияющего на внешнюю переменную.

У меня есть массив узлов HBox, которые должны работать как набор переключателей. Щелчок по любому из узлов обновит значение int, соответствующее позиции выбранного узла в массиве.

Это список массивов, потому что количество узлов HBox должно быть динамическим и определяться во время выполнения на основе аргументов. Каждый HBox идентичен по формату, но содержимое этикеток внутри уникально.

Цикл через список массивов (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)


Затем э. г. используйте конечную промежуточную переменную, например

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 в качестве элемента массива.

person Roland    schedule 13.08.2015
comment
Спасибо за решение, отлично сработало. Я не знал, что могу использовать конечные переменные внутри цикла for, поэтому я сделал быстрый поиск по нему и нашел эта ветка, которая может быть полезна тем, кто интересуется тем, как переменная final работает внутри области видимости, как я. - person Prester; 13.08.2015