Java 如果选择了ListCellRenderer,如何为组件使用主题选定样式
我有一个自定义的Java 如果选择了ListCellRenderer,如何为组件使用主题选定样式,java,codenameone,Java,Codenameone,我有一个自定义的ListCellRenderer,其中我希望用背景渐变突出显示当前选定的项目 似乎我应该能够在主题下的Codenameone Designer中为渲染组件定义选定的样式,并为组件设置UIID以实现这一点 但是,我不知道如何将列表项的选定状态传递给正在渲染的标签组件,因此我求助于手动更改样式,正如您在下面的代码中看到的那样。我可以用我的主题资源以某种方式实现同样的行为吗 public class PlanetListRenderer extends Container implem
ListCellRenderer
,其中我希望用背景渐变突出显示当前选定的项目
似乎我应该能够在主题下的Codenameone Designer中为渲染组件定义选定的
样式,并为组件设置UIID以实现这一点
但是,我不知道如何将列表项的选定状态传递给正在渲染的标签组件,因此我求助于手动更改样式,正如您在下面的代码中看到的那样。我可以用我的主题资源以某种方式实现同样的行为吗
public class PlanetListRenderer extends Container implements ListCellRenderer<Hashtable<String, String>> {
private Label planetLabel = new Label();
private Resources theme;
public PlanetListRenderer(Resources theme) {
this.theme = theme;
BoxLayout bl = new BoxLayout(BoxLayout.Y_AXIS);
setLayout(bl);
planetLabel.setUIID("PlanetListItem");
planetLabel.setTextPosition(Label.BOTTOM);
addComponent(planetLabel);
}
public Component getListFocusComponent(List list) {
return planetLabel;
}
public Component getListCellRendererComponent(List list,
Hashtable<String, String> value, int index, boolean isSelected) {
planetLabel.setIcon(theme.getImage("icon" + value.get("value") + ".png"));
planetLabel.setText(value.get("value"));
if ( isSelected ) {
planetLabel.getStyle().setBackgroundGradientStartColor(255255255);
planetLabel.getStyle().setBackgroundGradientRelativeY(0.2f);
planetLabel.getStyle().setBackgroundGradientRelativeSize(1.0f);
planetLabel.getStyle().setBackgroundType(Style.BACKGROUND_GRADIENT_RADIAL);
} else {
planetLabel.getStyle().setBackgroundType(Style.BACKGROUND_NONE);
}
return this;
}
}
公共类PlanetListRenderer扩展容器实现ListCellRenderer{
私有标签planetLabel=新标签();
私人资源主题;
公共PlanetListRenderer(资源主题){
this.theme=主题;
BoxLayout bl=新的BoxLayout(BoxLayout.Y_轴);
设置布局(bl);
planetLabel.setUIID(“PlanetListItem”);
planetLabel.setTextPosition(标签.底部);
添加组件(planetLabel);
}
公共组件getListFocusComponent(列表){
返回平面标签;
}
公共组件GetListCellRenderComponent(列表,
哈希表值,整数索引,布尔值(已选择){
planetLabel.setIcon(theme.getImage(“icon”+value.get(“value”)+”.png”);
planetLabel.setText(value.get(“value”));
如果(当选){
planetLabel.getStyle().setBackgroundGradientStartColor(255255);
planetLabel.getStyle().setBackgroundGradientRelativeY(0.2f);
planetLabel.getStyle().setBackgroundGradientRelativeSize(1.0f);
planetLabel.getStyle().setBackgroundType(Style.BACKGROUND\u GRADIENT\u RADIAL);
}否则{
planetLabel.getStyle().setBackgroundType(Style.BACKGROUND\u NONE);
}
归还这个;
}
}
我建议使用背景图像/边框,而不是效果不佳的渐变
默认情况下,触摸UI不会永久显示所选内容。如果您使用getAllStyles
而不是getStyle
,例如:
Form hi = new Form("Renderer Demo", new BorderLayout());
ArrayList<Map<String, String>> al = new ArrayList<>();
for(int iter = 0 ; iter < 100 ; iter++) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("key1", "Data " + iter);
data.put("key2", "Different Data " + iter);
al.add(data);
}
DefaultListModel<Map<String, String>> listModel = new DefaultListModel<>(al);
List<Map<String, String>> l = new List<>(listModel);
l.setRenderer(new ListCellRenderer() {
private Container container;
private Label cover;
private TextArea item;
{
item = new TextArea(2, 80);
cover = new Label();
container = BorderLayout.center(item).add(BorderLayout.EAST, cover);
container.setCellRenderer(true);
cover.setCellRenderer(true);
item.setCellRenderer(true);
}
@Override
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
Map<String, String> val = (Map<String, String>)value;
item.setText(val.get("key1"));
cover.setText(val.get("key2"));
Style itemStyle = item.getAllStyles();
Style coverStyle = cover.getAllStyles();
Style containerStyle = container.getAllStyles();
itemStyle.setBgTransparency(255);
coverStyle.setBgTransparency(255);
containerStyle.setBgTransparency(255);
if (isSelected) {
itemStyle.setFgColor(0xff0000);
itemStyle.setBgColor(0x000000);
coverStyle.setBgColor(0xff0000);
containerStyle.setBgColor(0x000000);
} else {
itemStyle.setFgColor(0x000000);
itemStyle.setBgColor(0xffffff);
coverStyle.setBgColor(0x000000);
containerStyle.setBgColor(0xffffff);
}
return container;
}
@Override
public Component getListFocusComponent(List list) {
return null;
}
});
hi.add(BorderLayout.CENTER, l);
hi.show();
Form hi=新表单(“渲染器演示”,new BorderLayout());
ArrayList al=新的ArrayList();
用于(国际热核试验堆=0;国际热核试验堆<100;国际热核试验堆++){
HashMap数据=新的HashMap();
数据输入(“键1”,“数据”+iter);
数据输入(“键2”,“不同数据”+iter);
添加(数据);
}
DefaultListModel listModel=新的DefaultListModel(al);
列表l=新列表(列表模型);
l、 setRenderer(新的ListCellRenderer(){
私人货柜;
自有标签封面;
私人区域项目;
{
项目=新文本区域(2,80);
封面=新标签();
容器=BorderLayout.center(item).add(BorderLayout.EAST,封面);
container.setCellRenderer(true);
cover.setCellRenderer(true);
item.setCellRenderer(true);
}
@凌驾
公共组件GetListCellRenderComponent(列表列表、对象值、int索引、布尔isSelected){
Map val=(Map)值;
item.setText(val.get(“key1”);
cover.setText(val.get(“键2”));
Style itemStyle=item.getAllStyles();
Style coverStyle=cover.getAllStyles();
Style containerStyle=container.getAllStyles();
itemStyle.setbgttransparency(255);
封面样式。缩进透明度(255);
集装箱运输方式.透明度(255);
如果(当选){
itemStyle.setFgColor(0xff0000);
itemStyle.setBgColor(0x000000);
coverStyle.setBgColor(0xff0000);
containerStyle.setBgColor(0x000000);
}否则{
itemStyle.setFgColor(0x000000);
itemStyle.setBgColor(0xffffff);
coverStyle.setBgColor(0x000000);
集装箱样式.立根颜色(0xffffff);
}
返回容器;
}
@凌驾
公共组件getListFocusComponent(列表){
返回null;
}
});
hi.add(BorderLayout.CENTER,l);
嗨,show();
下面是一个ListCellRenderer,用于更改所选项目。不确定它是否符合您的要求,但您可以通过搜索“Torquepower Diesel Cummins Engine”应用程序,在谷歌Play(或应用商店)上真正看到它。当您选择任何列表项时,您将看到背景和更改
public class FaultCodesListCellRenderer extends Container implements ListCellRenderer {
Label focus;
Label code;
Label effect;
Image warning;
Image emergency;
public FaultCodesListCellRenderer(Resources res) {
// get images for warning lights
emergency = res.getImage("emergency.png");
warning = res.getImage("warning.png");
setLayout(new BorderLayout());
setUIID("Underline");
code = new Label();
code.setUIID("BoldLabel");
code.setTextPosition(RIGHT);
code.getStyle().setMargin(Component.RIGHT, 6);
effect = new Label();
effect.setTickerEnabled(false);
addComponent(BorderLayout.WEST, code);
addComponent(BorderLayout.CENTER, effect);
int h = Display.getInstance().convertToPixels(8, false);
setPreferredH(code.getPreferredH() < h ? h : code.getPreferredH());
focus = new Label("");
focus.setUIID("UnderlineSelected");
}
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
Diagnostic diagnostic = (Diagnostic) value;
if (diagnostic.light.equals("R")) {
code.setIcon(emergency);
} else {
code.setIcon(warning);
}
code.setText(diagnostic.code);
effect.setText(diagnostic.effect);
return this;
}
public Component getListFocusComponent(List list) {
return focus;
}
public类FaultCodesListCellRenderer扩展容器实现ListCellRenderer{
标记焦点;
标签代码;
标签效应;
图像报警;
图像应急;
公共FaultCodesListCellRenderer(参考资料){
//获取警告灯的图像
emergency=res.getImage(“emergency.png”);
warning=res.getImage(“warning.png”);
setLayout(新的BorderLayout());
setUIID(“下划线”);
代码=新标签();
代码setUIID(“粗体标签”);
代码.设置位置(右);
code.getStyle().setMargin(Component.RIGHT,6);
效果=新标签();
效果。设置tickerEnabled(假);
添加组件(BorderLayout.WEST,代码);
添加组件(BorderLayout.CENTER,effect);
int h=Display.getInstance().convertToPixels(8,false);
setPreferredH(code.getPreferredH()
为语法高亮添加了Java标记感谢您的建议,但是我的问题是,我可以用我的主题资源实现同样的行为吗?因此,在您的示例中,我可以用普通颜色在“item”上设置UIID吗