问题描述
使用以下 MWE:
import controlP5.*;
import java.util.*;
ControlP5 cp5;
void setup() {
size(400,400);
cp5 = new ControlP5(this);
List l = Arrays.asList("a","b","c","d","e","f","g","h");
/* add a ScrollableList,by default it behaves like a DropdownList */
cp5.addScrollableList("dropdown")
.setPosition(100,100)
.setSize(200,100)
.setBarHeight(20)
.setItemHeight(20)
.addItems(l)
// .setType(ScrollableList.LIST) // currently supported DROPDOWN and LIST
;
}
void draw() {
background(240);
}
如何分别更改每个列表条目的字体颜色?我假设我必须使用类似于以下内容的 for 循环
for (int i =0; i < myarray.length; i++){
dropdown.setColorActive(elementDetermine(myarray[i]));
}
其中 elementDetermine() 接受一个整数并返回一个颜色。不幸的是,当我在 setup 或 draw 函数中运行此循环时,下拉列表不会在没有错误消息的情况下更改。
解决方法
遗憾的是,没有简单的现成方法可以单独更改每个列表条目的字体颜色。
正如您在 documentation 中看到的,可用方法访问适用于所有项目的主标题。
事实上,相同的 Label
组件会在所有列表项中重复使用,并且每个项目只需重新渲染一次(更改当前文本/颜色),如您在 source code 中看到的那样
如果您真的需要更改字体颜色,您可以这样做,但这将需要跳过很多 OOP 箍(因为每个项目没有 Label
实例的数组):
- 您需要创建一个自定义
ControllerView< ScrollableList >
来覆盖它的display()
方法 - 要使自定义
display()
与原始 ScrollableList 工作相同,您几乎需要复制超类 -
ScrollableList
超类有一堆可以从ScrollableListView
类轻松访问的私有属性,因为它是ScrollableList
的一部分,但是在我们的例子中,所有这些 {{1} } /private
需要在protected
中访问的属性需要可以访问。为此,实现了一个display()
子类 (ScrollableList
),它主要在PopUpScrollableList
中使用private
/protected
属性的任何地方复制它的超类行为,并且还使它们可用。
最后,自定义可滚动列表可以有一个 display()
,它可以存储自定义颜色,以便可以在重写的 color[]
方法中访问和呈现它们:
display()