So this must be the problem.
I guess border layout is what you use when in landscape and you don't
update it when moving to portrait. It's hard to tell but you can just
override form.setLayout() with a call to super. Then place a breakpoint
there to see who invokes it.
On Wednesday, September 30, 2020 at 11:19:39 AM UTC+3 P5music wrote:
> Forget the "not relevant" part, because conditions are not satisfied for
> it to be executed.
>
> What I experience is that
> when the app starts in landscape mode (simulator was intentionally left in
> that state)
> the user interface correctly displays just the master container at full
> screen (so the detail container is not added yet)
> if I juggle with orientation changes the two modes correctly alternate
>
> but the app starts in portrait mode (simulator was intentionally left in
> that state)
> when an orientation change occurs
> and now the simulator is in landscape mode
> (containers are removed)
>
> I see that the master detail TableLayout is not working because just the
> master container is at full screen.
> if I juggle with orientation changes nothing changes.
> Debug shows that the right code is executed at orientation change, that is
> if(isTablet() && !isPortrait() )
> {
> ...
> }
>
> If I step into, I see that mainForm has BorderLayout and not TableLayout:
> CallingForm[x=0 y=0 width=2048 height=1534 name=null, layout =
> BorderLayout, scrollableX = false, scrollableY = false, components =
> [Container, Toolbar], title = Label[x=0 y=47 width=1536 height=0 name=null,
> text = , gap = 2], visible = true]
>
> but at startup this is executed (I tried also executing it every time, see
> commented lines)
> tl=new TableLayout(1,2);
> mainForm.setLayout(tl);
> mainForm.setScrollable(false);
>
> I see also
> Exception in thread "AWT-EventQueue-0" Failed to get location on
> screen:component must be showing on the screen to determine its location
> in the console after the execution of the method.
>
> Il giorno mercoledì 30 settembre 2020 alle 05:23:37 UTC+2 Shai Almog ha
> scritto:
>
>> It's hard to tell from the code. The "not relevant here" code looks very
>> suspicious though.
>>
>> Did you try just stepping over this in the debugger with the simulator?
>> I assume you reproduced it there so just step over the lines and see
>> what's going on. Are the components physically added but not visible?
>> Are they added to the wrong location or not sized correctly?
>>
>> On Tuesday, September 29, 2020 at 12:07:50 PM UTC+3 P5music wrote:
>>
>>> My codename app has master/detail layout.
>>> A TableLayout is used for that, in landscape mode.
>>> It is used also in portrait mode with different proportions.
>>>
>>> If the app starts in landscape mode, the master and the detail are
>>> visible, and subsequent orientation changes are handled correctly and the
>>> user interface is succesfully reconstructed.
>>>
>>> If the app starts in portrait mode, only the master is visible by design
>>> (that's OK) but after the orientation change the user interface is not
>>> reconstructed completely
>>> because
>>> the master is just at full size, while the detail is not reconstructed.
>>>
>>> This is the code of a method that is called at startup and when
>>> orientation changes:
>>>
>>> private void setContainers()
>>> {
>>> mainEditingContainer.remove();
>>>
>>> //these lines are to handle fab correctly
>>> if (fabBoundContainer!=null) fabBoundContainer.remove();
>>> if (fabFirstTime)
>>> {fabBoundContainer=fab.bindFabToContainer(itemListContainer);}
>>>
>>>
>>> //mainForm.setLayout(BoxLayout.x()); not useful to reset the TableLayout
>>>
>>> //the issue is present also without these revalidations
>>> mainEditingContainer.revalidate();
>>> editingContainer.revalidate();
>>> fabBoundContainer.revalidate();
>>> mainForm.revalidate();
>>>
>>> if (isPortrait() && conditions) //not relevant here
>>> {
>>> new EditingForm(appData,myData,mainForm,editingContainer,other
>>> parameters).show();
>>> }
>>>
>>> if (isPortrait() && !(conditions)) { // only the master in this mode
>>> //tl=new TableLayout(1,2); not useful
>>> //mainForm.setLayout(tl); not useful
>>>
>>>
>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)
>>>
>>> (1 * 100)), fabBoundContainer);
>>> }
>>>
>>> if(isTablet() && !isPortrait() ) { //master-detail in landscape
>>> mode
>>> //tl=new TableLayout(1,2); not useful
>>> //mainForm.setLayout(tl); not useful
>>>
>>>
>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)
>>>
>>> (leftContainerRatio * 100)), fabBoundContainer).add(mainEditingContainer);
>>> }
>>>
>>> mainEditingContainer.revalidate();
>>> editingContainer.revalidate();
>>> fabBoundContainer.revalidate();
>>> mainForm.revalidate();
>>>
>>> if (fabFirstTime) fabFirstTime=false;
>>> }
>>>
>>> Some commented lines are with some tentative workaround but not
>>> successful.
>>>
>>> What's wrong? How can I achieve the complete reconstruction of UI in
>>> landscape mode, when the app is started in portrait and then rotates?
>>> I remind you that if the app starts in landscape mode, there are no
>>> issues at any subsequent device rotation (just a BrowserComponent is not
>>> resizing, this will be addressed separately).
>>> Thanks in avance
>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"CodenameOne Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/codenameone-discussions/2a43a928-8b53-4dae-9369-de59883dbde5n%40googlegroups.com.