Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果选择了ListCellRenderer,如何为组件使用主题选定样式_Java_Codenameone - Fatal编程技术网

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吗