如何使SpanButton成为Lead?

时间:2017-09-26 20:01:51

标签: codenameone

当您为Container创建SpanButton引导时,它不会收到事件。我已经尝试过调试,但还没有设法理解为什么它不起作用。这似乎是一个CN1错误,但我可能误解了一些东西。

这是一个重现问题的测试用例:

    Form hi = new Form("Welcome", BoxLayout.y());

    //test case shows that when you make a normal Button lead for a Container, 
    //it works as expected.
    //Doing the same with a SpanButton doesn't work.
    //When you click button it correctly hides the Label. 
    //Clicking spanButton doesn't hide the label.
    //
    //Test also shows a second issue: when adding a Command to a SpanButton, 
    //the Command text is shown in parallel with the SpanButton's text


    //edit Button works normal
    Button button = new Button("Normal Button works");
    Label hide2 = new Label("Now you see me, now you don't2");
    Command cmd2 = Command.create("CmdTxt2", null, (ev) -> {
        hide2.setHidden(!hide2.isHidden());
        hi.revalidate();
    });
    button.setCommand(cmd2);
    Label editButtonLabel2 = new Label();
    FontImage.setMaterialIcon(editButtonLabel2, FontImage.MATERIAL_CHEVRON_RIGHT); // [>]

    Container cont2 = BorderLayout.centerEastWest(button, editButtonLabel2, null);
     cont2.setLeadComponent(button); //for a normal button, the lead works correctly
    hi.add(cont2);
    hi.add(hide2);

    //with SpanButton it doesn't work:
    SpanButton spanButton = new SpanButton("SpanButton does not work");
    Label hide = new Label("Now you see me, now you don't");
    Command cmd = Command.create("CmdText", null, (ev) -> {
        hide.setHidden(!hide.isHidden());
        hi.revalidate();
    });
    spanButton.setCommand(cmd);
    Label editButtonLabel = new Label();
    FontImage.setMaterialIcon(editButtonLabel, FontImage.MATERIAL_CHEVRON_RIGHT); // [>]

    Container cont = BorderLayout.centerEastWest(spanButton, editButtonLabel, null);
    cont.setLeadComponent(spanButton); //spanButton made lead for cont, so should receive all events for cont, but doesn't
    hi.add(cont);
    hi.add(hide);


    hi.show();

1 个答案:

答案 0 :(得分:1)

这可能是因为SpanButton本身就是一个容器,并且还有一个Button的潜在客户成分吗?

您可以创建一个普通的Button并将该命令应用于该命令,然后将容器的主要组件设置为此Button。您不必将此Button添加到容器中,添加SpanButton,容器仍会收到所有活动。

Form hi = new Form("Welcome", BoxLayout.y());

/*test case shows that when you make a normal Button lead for a Container, 
it works as expected.
Doing the same with a SpanButton doesn't work.
When you click the button, it correctly hides the Label. 
Clicking spanButton doesn't hide the label.

Test also shows a second issue: when adding a Command to a SpanButton, 
the Command text is shown in parallel with the SpanButton's text*/


//edit Button works normal
Button button = new Button("Normal Button works");
Label hide2 = new Label("Now you see me, now you don't2");
Command cmd2 = Command.create("CmdTxt2", null, (ev) -> {
    hide2.setHidden(!hide2.isHidden());
    hi.revalidate();
});
button.setCommand(cmd2);
Label editButtonLabel2 = new Label();
FontImage.setMaterialIcon(editButtonLabel2, FontImage.MATERIAL_CHEVRON_RIGHT); // [>]

Container cont2 = BorderLayout.centerEastWest(button, editButtonLabel2, null);
cont2.setLeadComponent(button); //for a normal button, the lead works correctly
hi.add(cont2);
hi.add(hide2);

//with SpanButton it doesn't work:
SpanButton spanButton = new SpanButton("SpanButton does not work");
Label hide = new Label("Now you see me, now you don't");
Command cmd = Command.create("CmdText", null, (ev) -> {
    hide.setHidden(!hide.isHidden());
    hi.revalidate();
});
Button btnHidden = new Button(cmd);

Label editButtonLabel = new Label();
FontImage.setMaterialIcon(editButtonLabel, FontImage.MATERIAL_CHEVRON_RIGHT); // [>]

Container cont = BorderLayout.centerEastWest(spanButton, editButtonLabel, null);
cont.setLeadComponent(btnHidden); //spanButton made lead for cont, so should receive all events for cont, but doesn't
hi.add(cont);
hi.add(hide);


hi.show();