controlP5 ListBox выбор активной обработки цвета

Я хочу, чтобы выбранный элемент ListBox отображался красным цветом и оставался таким до тех пор, пока не сделаю другой выбор. Как я могу это сделать? В данный момент он остается красным, когда я нажимаю и удерживаю клавишу мыши, а затем возвращаюсь к исходному цвету фона после того, как я отпущу. Является ли это функцией метода.setColorActive()? Или он должен постоянно поменять на цвет, указанный мной после нажатия? Мой код ниже. Благодарю.

list = controlp5.addListBox("LIST")
      .setPosition(130, 40)
      .setSize(100, 150)
      .setItemHeight(20)
      .setBarHeight(20)
      .setColorBackground(color(40, 128))
      .setColorActive(color(255, 0, 0))

1 ответ

Решение

Насколько я могу судить по исходному коду, нет смысла отслеживать, выбран контроллер или нет. Тем не менее, вы можете вручную отслеживать с помощью слушателя controlEvent и вручную изменить цвет фона в качестве быстрого и хакерского обходного пути:

import controlP5.*;

ControlP5 controlp5;
ListBox list;
int selectedIndex = -1;//no selection initially
int colourBG = 0xffff0000;
int colourSelected = 0xffff9900;

void setup(){
  size(400,400);
  controlp5 = new ControlP5(this);
  list = controlp5.addListBox("LIST")
      .setPosition(130, 40)
      .setSize(100, 150)
      .setItemHeight(20)
      .setBarHeight(20)
      .setColorBackground(colourBG)
      .setColorActive(colourSelected);

   for (int i=0;i<80;i++) {
    ListBoxItem lbi = list.addItem("item "+i, i);
    lbi.setColorBackground(colourBG);
  }
}
void draw(){
  background(255);
}
void controlEvent(ControlEvent e) {
  if(e.name().equals("LIST")){
    int currentIndex = (int)e.group().value();
    println("currentIndex:  "+currentIndex);
    if(selectedIndex >= 0){//if something was previously selected
      ListBoxItem previousItem = list.getItem(selectedIndex);//get the item
      previousItem.setColorBackground(colourBG);//and restore the original bg colours
    }
    selectedIndex = currentIndex;//update the selected index
    list.getItem(selectedIndex).setColorBackground(colourSelected);//and set the bg colour to be the active/'selected one'...until a new selection is made and resets this, like above

  }

}

Таким образом, в приведенном выше примере selectedIndex сохраняет предыдущий / самый последний выбор в качестве индекса списка. Это затем используется в обработчике controlEvent. Если был выбран ранее, восстановите нормальный цвет фона. Затем продолжайте устанавливать выбранный индекс на самый последний, выбирая и устанавливая цвет фона в качестве активного, чтобы визуально он выглядел выделенным.

Это ручной / хакерский подход. Более длинная версия будет включать либо расширение Java-класса ListBox и добавление этой функции в, либо редактирование исходного кода controlP5, перекомпиляцию библиотеки и использование пользовательской версии.

Другие вопросы по тегам