CN1:从多按钮的第二行更改文本颜色

时间:2018-12-27 12:37:32

标签: java codenameone

我想从多按钮更改第二行的文本颜色。我正在使用新的GUI构建器,并且已通过编程方式创建了多按钮。

我已经尝试了其他解决方案,例如获取文本,然后尝试更改颜色。但是我无法将String转换为Multibutton,因此无法更改文本的颜色

Bestellungen bestellungen = new Bestellungen();
            bestellungen.getOrders();
        //Show orders in app
        Container conOrders = new Container(BoxLayout.y());
        conOrders.setUIID("conOrders");
        conOrders.setScrollableY(true);

        //Get elements from array
        for (int i = 0; i < bestellungen.getOrdersArr().size(); i++) {
            String order = bestellungen.getOrdersArr().get(i);
            String status = bestellungen.getOrdersStatusArr().get(i);

            MultiButton mb = new MultiButton(order);

            //TODO: CHANGE THE COLORS of line2
            switch (status) {
                case "completed":
                    //Change the second line to color green
                    mb.setTextLine2(status);
                    break;
                case "processing":
                    //Change the second line to color yellow
                    mb.setTextLine2(status);
                    break;
                case "cancelled":
                    //Change the second line to color red
                    mb.setTextLine2(status);
                    break;
                default:
                    mb.setTextLine2(status);
                    break;
            }

            conOrders.add(mb);

        }

如果状态字符串为“已完成”,则TextLine2文本应为绿色,依此类推...任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

简单的解决方法是setUIIDLine2,然后在主题中定义UIID以具有所需的颜色。

但是,如果您想直接控制标签颜色,则可以修改容器层次结构。请注意,这有点骇人听闻,并且可能会在以后的Codename One更新中更改。

它依赖于这样一个事实,MultiButton是带有子控件的容器组件,因此, 可以通过向下浏览层次结构来访问第二行(这是一个标签)。

只有一个小困难,就是层次结构取决于 取向。因此,必须区分这两种情况:

//  Vertical orientation
//
//  MultiButton
//      |    
//      |-- Container
//      |      | 
//      |      |-- Container
//      |      |      |
//      |      |      |-- Label (name=Line2)    <--- this one!
//      |      |      |-- Label (name=Line3)
//      |      |      |-- Label (name=Line4)
//      |      |
//      |      |-- Label (name=Line1)
//      |              
//      |-- Container
//      |      |
//      |      |-- Label (name=icon)
//      |  
//      |-- Container
//             |
//             |-- Button (name=emblem)
//
// ------------------------------------------------------------
//
//  Horizontal orientation
//
//  MultiButton
//      |    
//      |-- Container
//      |      | 
//      |      |-- Container
//      |      |      |
//      |      |      |-- Label (name=Line3)
//      |      |      |-- Label (name=Line4)
//      |      |
//      |      |-- Label (name=Line1)
//      |      | 
//      |      |-- Container
//      |      |      |
//      |      |      |-- Label (name=Line2)    <--- this one!
//      |      |      
//      |-- Container
//      |      |
//      |      |-- Label (name=icon)
//      |  
//      |-- Container
//             |
//             |-- Button (name=emblem)
//
private void setLine2Color(MultiButton multiButton, int color) {
    List<Component> childsLevel1 = multiButton.getChildrenAsList(false);
    Container firstContainerLevel1 = (Container)childsLevel1.get(0);
    List<Component> childsLevel2 = firstContainerLevel1.getChildrenAsList(false);
    Container targetContainerLevel2 = (Container)childsLevel2.get(multiButton.isHorizontalLayout() ? 2 : 0);
    List<Component> childsLevel3 = targetContainerLevel2.getChildrenAsList(false);
    Label firstLabelLevel3 = (Label)childsLevel3.get(0);
    firstLabelLevel3.getAllStyles().setFgColor(color);
}

我已经尝试了几种情况,但似乎可行:

enter image description here

因此,以下应为您工作:

MultiButton mb = new MultiButton(order);

switch (status) {
    case "completed":
        //Change the second line to color green
        setLine2Color(mb, 0x00ff00);
        mb.setTextLine2(status);
        break;
    case "processing":
        //Change the second line to color yellow
        setLine2Color(mb, 0xffff00);
        mb.setTextLine2(status);
        break;
    case "cancelled":
        //Change the second line to color red
        setLine2Color(mb, 0xff0000);
        mb.setTextLine2(status);
        break;
    default:
        mb.setTextLine2(status);
        break;
}