1
votes

I've added component in onTop side menu with a button which is lead component of the container. But clicking either button or other component has no effect. How can I make it work? Moreover I've gone through a blog for south component in onTop side menu. I've updated the cn1 to 8.1 and it gives "Your project libs are up to date" but still I cannot use it(setComponentToSideMenuSouth). I want to keep the component at the top of the side menu, so will setComponentToSideMenuNorth also exists?

Button userArea = new Button("lead Btn");
userArea.addActionListener(e->{
    System.out.println("bbeck");
});

TextArea emailArea = new TextArea("abc");

Container userInfoContainer = BoxLayout.encloseY(userArea, emailArea);
    Container profileContainer = new Container(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER));
profileContainer.add(BorderLayout.CENTER, userInfoContainer);
profileContainer.add(BorderLayout.East, new Label("abc));
profileContainer.setLeadComponent(userArea);

f.getToolbar().addComponentToSideMenu(profileContainer);

Update:

public void start() {
    if(current != null){
        current.show();
        return;
    }
    Form hi = new Form("Hi World", BoxLayout.y());
    hi.add(new Label("Hi World"));
    hi.show();

    hi.getToolbar().setComponentToSideMenuSouth(new Label("abc"));

    Command abc = new Command("abc"){

        @Override
        public void actionPerformed(ActionEvent evt) {
            System.out.println("bibek");
        }

    };
    hi.getToolbar().addCommandToSideMenu(abc);
}

Here adding getToolbar().setComponentToSideMenuSouth(new Label("abc")); in a form does nothing (theres no side menu). And as soon as "addCommandToSideMenu(cmd)" is added, it doesn't compile & gives following error

java.lang.IllegalArgumentException: Component is already contained in Container: Container[x=0 y=0 width=0 height=0 name=null, layout = BorderLayout, scrollableX = false, scrollableY = false, components = [Container]]

if I change form layout to boxlayout ie. super(new BoxLayout(BoxLayout.Y_AXIS)) , it gives following error

java.lang.IllegalArgumentException: Component is already contained in Container: Container[x=0 y=0 width=0 height=0 name=null, layout = BorderLayout, scrollableX = false, scrollableY = false, components = [Container]]

Error log:

WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
java.lang.IllegalArgumentException: Component is already contained in Container: Container[x=0 y=0 width=0 height=0 name=null, layout = BorderLayout, scrollableX = false, scrollableY = false, components = [Container]]
    at com.codename1.ui.Container.insertComponentAtImpl(Container.java:717)
    at com.codename1.ui.Container.insertComponentAt(Container.java:708)
    at com.codename1.ui.Container.addComponent(Container.java:652)
    at com.codename1.components.InteractionDialog.addComponent(InteractionDialog.java:161)
    at com.codename1.ui.Container.add(Container.java:281)
    at com.codename1.ui.Toolbar.constructOnTopSideMenu(Toolbar.java:897)
    at com.codename1.ui.Toolbar.addCommandToSideMenu(Toolbar.java:771)
    at com.bbeck.zzz.aaa.start(Application.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.codename1.impl.javase.Executor$1$1.run(Executor.java:123)
    at com.codename1.ui.Display.processSerialCalls(Display.java:1116)
    at com.codename1.ui.Display.mainEDTLoop(Display.java:911)
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
Java Result: 1
BUILD SUCCESSFUL (total time: 22 seconds)
1
What's profileContainer? It seems you have a compilation issue as East should be EAST. setComponentToSideMenuSouth should work fine with the current project libs did you try compiling with toolbar.setComponentToSideMenuSouth(new Label()); does that compile? Notice that netbeans sometimes marks stuff in red but still compiles it - Shai Almog
profileContainer is jst a container with Borderlayout. Its EAST in code (my mistake in the question above sorry. Please see the update above - Amrita Stha
Component is already in container is an exception with a stack trace that will point at a line where you are adding a component which you already added to a different container. South will not generate the side menu it will only add a component to the bottom of an existing side menu - Shai Almog
If I use either setComponentToSideMenuSouth or addCommandToSideMenu, it doesn't gives already in container exception. If used both, it gives the exception which points to setComponentToSideMenuSouth() line - Amrita Stha
What's the full stack trace? - Shai Almog

1 Answers

1
votes

Thanks, this is a bug in the current implementation. I committed this fix.

The fix will be available as part of our standard Friday update process on January 19th 2018.