尝试在Codename One中的MultiButton上设置按下/选定样式的样式会导致堆栈溢出错误

时间:2017-10-11 10:42:26

标签: css codenameone

我只想在用户按下已在CSS中设置样式的MultiButton时向用户提供反馈。

MultiButton的使用方式如下:

 String newStyleName = "NewText";
    Style newStyle = new Label("g", newStyleName).getUnselectedStyle();
    String newSubStyleName = "NewSubText";
    String newIconStyleName = "NewIcon";

MultiButton nameButton = new MultiButton("Name");
    nameButton.setTextLine2("Give a name");
    nameButton.setIcon(FontImage.createMaterial(FontImage.MATERIAL_TEXT_FIELDS, newStyle));
    nameButton.setIconUIID(newIconStyleName);
    nameButton.setUIIDLine1(newStyleName);
    nameButton.setUIIDLine2(newSubStyleName);
    this.add(nameButton);

并且样式如下:

NewText {
color: #000000; 
background-color: #e2f1f8;
text-align: left;
padding-left: 2mm;
padding-right: 2mm;
padding-top: 1mm;
padding-bottom: 1px;
margin-left: 0;
margin-right: 0;
margin-top: 0;
margin-bottom: 0;
font-family: "native:MainLight"; 
font-size: 4.2mm; 
}

NewSubText {
cn1-derive: NewText;
padding-top: 0mm;
padding-bottom: 1mm;
margin-bottom: 0mm;
color: #b0bec5;
font-size: 3.5mm;
}

NewIcon {
cn1-derive: NewText;
padding-top: 1mm;
padding-bottom: 1mm;
padding-left: 2mm;
padding-right: 2mm; 
background-color: #e2f1f8;
}

为了实现向用户提供反馈的目标,我添加了:

NewText.pressed {
cn1-derive: NewText;
background-color: #808d94;
}

NewText.selected {
cn1-derive: "NewText.pressed";   
}

但是这会导致模拟器出错:

Error creating style NewText. selected: false prefix: press#[EDT] 0:1:2,42 - Error creating style NewText. selected: false prefix: press#

java.lang.StackOverflowErrorjava.lang.StackOverflowError
at com.codename1.io.Log.createWriter(Log.java:367)
at com.codename1.io.Log.getWriter(Log.java:384)
at com.codename1.io.Log.print(Log.java:348)
at com.codename1.io.Log.p(Log.java:284)
at com.codename1.io.Log.p(Log.java:274)
at com.codename1.ui.plaf.UIManager.getComponentStyleImpl(UIManager.java:356)
at com.codename1.ui.plaf.UIManager.createStyle(UIManager.java:1364)
at com.codename1.ui.plaf.UIManager.getComponentStyleImpl(UIManager.java:349)
at com.codename1.ui.plaf.UIManager.createStyle(UIManager.java:1364)

如果我一直按下按钮,它最终会按下背景颜色。

顺便说一下,如果我只定义所选样式(没有按下样式),它就不会编译:

java.lang.StackOverflowError
at com.codename1.ui.css.CSSTheme$Element.getFlattenedStyle(CSSTheme.java:2650)

因此看起来样式之间存在循环依赖性问题导致此堆栈溢出错误但我无法看到:NewText选择器样式已完全定义。

这个false prefix press#意味着什么,以及如何删除此错误?

提前致谢,

1 个答案:

答案 0 :(得分:1)

当组件之间存在循环继承依赖性时会发生这种情况,这就是派生样式属性如此棘手的原因。很难看到发生了什么,因为有时继承是在基本主题中定义的,例如MultiButton可能来自Button