It's very strange. I had to add a revalidate() also after removing the 
containers.
I do not know if it is intended behaviour but this code works (see also 
below this code, there is the second part of this message about fab 
breaking it):

private void setContainers()
{

mainEditingContainer.remove();
itemListContainer.remove();
//fab.remove();


mainEditingContainer.revalidate();
itemListContainer.revalidate();
mainForm.revalidate();

if (isPortrait() && (other conditions*)*)
{
new EditingForm(appData,myData,mainForm,editingContainer,other Parameters
).show();

}

if (isPortrait() && !(*other conditions*))
{
//mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(itemListContainer));
mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),
itemListContainer);
}

if(isTablet() && !isPortrait() ) {

/*mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)
 
(leftContainerRatio * 100)), fab.bindFabToContainer(itemListContainer))
.add(mainEditingContainer);*/
mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int) 
(leftContainerRatio * 100)), itemListContainer)
.add(mainEditingContainer);

}

}

mainEditingContainer.revalidate();
itemListContainer.revalidate();
mainForm.revalidate();
}
------

But now the fab problem is back. Indeed if I use this code


private void setContainers()
{

mainEditingContainer.remove();
itemListContainer.remove();

if (!fabFirstTime) fab.remove();


mainEditingContainer.revalidate();
itemListContainer.revalidate();
mainForm.revalidate();

if (isPortrait() && (*conditions*)
{
new EditingForm(appData,myData,mainForm,editingContainer,other parameters
).show();

}

if (isPortrait() && !(*conditions*)
{
mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(
itemListContainer));
}

if(isTablet() && !isPortrait() ) {

mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int) 
(leftContainerRatio * 100)), fab.bindFabToContainer(itemListContainer
)).add(mainEditingContainer);

}

mainEditingContainer.revalidate();
itemListContainer.revalidate();
mainForm.revalidate();

if (fabFirstTime) fabFirstTime=false;

}

the user interface is not reconstructed again and no button is visible.
If I do not remove the fab I get the error 
Component is already contained in Container: Container[x=0 y=0 width=1136 
height=1920 name=null, layout = FlowLayout, scrollableX = false, 
scrollableY = false, components = [FloatingActionButton]]
but I can see the button (in an wrong position because it is the old x 
position I think, indeed orientation change has occurred).
Thanks in advance

Il giorno lunedì 21 settembre 2020 alle 04:35:07 UTC+2 Shai Almog ha 
scritto:

> I assumed incorrectly that you're adding a component that's already added. 
> I think what's happening is that you removed the components before the 
> re-layout then added them after. You would need to do either an 
> animateLayout() or a revalidate() in this case. 
>
> On Sunday, September 20, 2020 at 3:16:12 PM UTC+3 P5music wrote:
>
>> Yeah, I just provided the error because you asked about, I just would 
>> like to know why the user interface is not reconstructed after orientation 
>> change. The provided mehod above is called both at startup and when an 
>> orientation change occurs, but in the latter case it fails in recreating 
>> the user interface.
>> Regards
>>
>> Il giorno domenica 20 settembre 2020 alle 07:18:05 UTC+2 Shai Almog ha 
>> scritto:
>>
>>> OK I see this printout. Do you have CEF enabled?
>>> Is there a browser component somewhere? 
>>> This error should be meaningless and shouldn't impact the behavior of 
>>> the app, it's related to the simulator.
>>>
>>> On Saturday, September 19, 2020 at 12:30:49 PM UTC+3 P5music wrote:
>>>
>>>> No back trace is available, just the text you have read in the previous 
>>>> post.
>>>> The fab is only added to mainForm and bound to masterContainer (you can 
>>>> see in the code snippet above) but
>>>> even if I do not have the fab at all in the application the error is 
>>>> issued:
>>>> Exception in thread "AWT-EventQueue-0" Exception in thread 
>>>> "AWT-EventQueue-0" Exception in thread "AWT-EventQueue-0" Exception in 
>>>> thread "AWT-EventQueue-0" Failed to get location on screen:component must 
>>>> be showing on the screen to determine its location
>>>>
>>>> No line is highlighted in the source code because no Java exception is 
>>>> issued.
>>>>
>>>> Il giorno sabato 19 settembre 2020 alle 07:41:29 UTC+2 Shai Almog ha 
>>>> scritto:
>>>>
>>>>> Do you see the full stack trace? 
>>>>> It should point at a specific line. What's added at that line?
>>>>> That component should be removed.
>>>>>
>>>>> The FAB could be problematic since FAB is added in a unique way. Is it 
>>>>> added to the form or an arbitrary container?
>>>>>
>>>>> On Friday, September 18, 2020 at 10:43:10 AM UTC+3 P5music wrote:
>>>>>
>>>>>> I only get 
>>>>>> Exception in thread "AWT-EventQueue-0" Failed to get location on 
>>>>>> screen:component must be showing on the screen to determine its location
>>>>>> Failed to get location on screen:component must be showing on the 
>>>>>> screen to determine its location
>>>>>> Indeed in my code the removal is performed:
>>>>>> editingContainer.remove();
>>>>>> itemListContainer.remove();
>>>>>> fab.remove();
>>>>>>
>>>>>> So what could be the reason?
>>>>>>
>>>>>> Il giorno venerdì 18 settembre 2020 alle 06:15:30 UTC+2 Shai Almog ha 
>>>>>> scritto:
>>>>>>
>>>>>>> Look at the console when debugging this in the simulator. You would 
>>>>>>> probably see exceptions indicating you can't add a component to a 
>>>>>>> Container 
>>>>>>> if it's already added to some container (even if it's the same 
>>>>>>> container). 
>>>>>>> Yes, you need to adapt the code to handle that logic. Orientation 
>>>>>>> change 
>>>>>>> re-layout needs to be slightly different from first showing of the UI. 
>>>>>>> I'd 
>>>>>>> also recommend an animation on orientation change which is something we 
>>>>>>> don't need/want for the first showing of the form.
>>>>>>>
>>>>>>> On Thursday, September 17, 2020 at 12:07:41 PM UTC+3 P5music wrote:
>>>>>>>
>>>>>>>> I created a method like the one you can see below. It is called at 
>>>>>>>> startup and it works. It is also called in the orientation change 
>>>>>>>> listener.
>>>>>>>>
>>>>>>>> But when the orientation changes I see that the user interface is 
>>>>>>>> cleaned up and no containers appear, that is, the new rotated 
>>>>>>>> interface 
>>>>>>>> does not appear, does not form, it is blank.
>>>>>>>> If there is no call to the remove() methods I get errors like 
>>>>>>>> "already added", and it is reasonable because the containers don't get 
>>>>>>>> removed.
>>>>>>>> So the right version has to include the remove() calls. 
>>>>>>>>
>>>>>>>> Hence, I think the code is adding the right containers as it 
>>>>>>>> happens at startup but the user interface is not shown. Why? 
>>>>>>>>
>>>>>>>> private void setContainersAndForm()
>>>>>>>> {
>>>>>>>> editingContainer.remove();
>>>>>>>> itemListContainer.remove();
>>>>>>>> fab.remove();
>>>>>>>>
>>>>>>>>  if (isPortrait() && (editingConditions))
>>>>>>>>         {
>>>>>>>>             new 
>>>>>>>> EditingForm(appData,myData,mainForm,editingContainer,otherParameters).show();
>>>>>>>>             setEditor();
>>>>>>>>
>>>>>>>>         if (isPortrait() && !(editingConditions)
>>>>>>>>         {
>>>>>>>>             removeContainers();
>>>>>>>>             
>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(masterContainer));
>>>>>>>>         }
>>>>>>>>         
>>>>>>>>         if(isTablet() && !isPortrait() )
>>>>>>>>         {
>>>>>>>>
>>>>>>>>            removeContainers();
>>>>>>>>             
>>>>>>>> ((EditingContainer)editingContainer).setCallingForm(mainForm);
>>>>>>>>             
>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(leftContainerRatio*100)),fab.bindFabToContainer(masterContainer))
>>>>>>>>                     .add( editingContainer);
>>>>>>>>             if (editingConditions) setEditor();
>>>>>>>>
>>>>>>>>         }
>>>>>>>>
>>>>>>>> // also with these two lines
>>>>>>>> //mainEditingContainer.revalidate();
>>>>>>>> //itemListContainer.revalidate();
>>>>>>>>
>>>>>>>> mainForm.revalidate();
>>>>>>>> }
>>>>>>>>
>>>>>>>> Il giorno giovedì 17 settembre 2020 alle 06:15:49 UTC+2 Shai Almog 
>>>>>>>> ha scritto:
>>>>>>>>
>>>>>>>>> Look sat the code for kitchen sink. Notice we encapsulate each 
>>>>>>>>> demo in a Demo class. Then in the main KitchenSink class we show 
>>>>>>>>> either a 
>>>>>>>>> Form or a Container based on the mode (tablet or phone). Yes it's 
>>>>>>>>> pretty 
>>>>>>>>> similar to this.
>>>>>>>>>
>>>>>>>>> On Wednesday, September 16, 2020 at 9:54:57 AM UTC+3 P5music wrote:
>>>>>>>>>
>>>>>>>>>> What you say seems to be merging the two things, like I am 
>>>>>>>>>> already doing? Indeed my app is for tablet and phone, so my question 
>>>>>>>>>> was 
>>>>>>>>>> just about the management of these two scenarios, and the 
>>>>>>>>>> orientation too.
>>>>>>>>>>
>>>>>>>>>> Is this what you are advicing?
>>>>>>>>>>
>>>>>>>>>>   if (isPortrait() && (editingConditions))
>>>>>>>>>>         {
>>>>>>>>>>             new 
>>>>>>>>>> EditingForm(appData,myData,mainForm,editingContainer,otherParameters).show();
>>>>>>>>>>             setEditor();
>>>>>>>>>>
>>>>>>>>>>         if (isPortrait() && !(editingConditions)
>>>>>>>>>>         {
>>>>>>>>>>             removeContainers();
>>>>>>>>>>             
>>>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(1*100)),fab.bindFabToContainer(masterContainer));
>>>>>>>>>>         }
>>>>>>>>>>         
>>>>>>>>>>         if(isTablet() && !isPortrait() )
>>>>>>>>>>         {
>>>>>>>>>>
>>>>>>>>>>            removeContainers();
>>>>>>>>>>             
>>>>>>>>>> ((EditingContainer)editingContainer).setCallingForm(mainForm);
>>>>>>>>>>             
>>>>>>>>>> mainForm.add(tl.createConstraint().heightPercentage(100).widthPercentage((int)(leftContainerRatio*100)),fab.bindFabToContainer(masterContainer))
>>>>>>>>>>                     .add( editingContainer);
>>>>>>>>>>             if (editingConditions) setEditor();
>>>>>>>>>>
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>> Thanks in advance
>>>>>>>>>> Il giorno mercoledì 16 settembre 2020 alle 04:40:29 UTC+2 Shai 
>>>>>>>>>> Almog ha scritto:
>>>>>>>>>>
>>>>>>>>>>> My advice is to use Containers for everything but have global 
>>>>>>>>>>> navigation logic. So when you need to show a UI element you can 
>>>>>>>>>>> invoke that 
>>>>>>>>>>> single place that decides.
>>>>>>>>>>>
>>>>>>>>>>> If this is on a phone you would create a Form add the container 
>>>>>>>>>>> to it and set its title etc. then show. 
>>>>>>>>>>> If this is a tablet you would replace the last container.and 
>>>>>>>>>>> update the subtitle in the UI
>>>>>>>>>>>
>>>>>>>>>>> On Tuesday, September 15, 2020 at 10:39:40 AM UTC+3 P5music 
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> So your advice is to use one form for the master/detai in every 
>>>>>>>>>>>> configuration, just managing the container, with the override of 
>>>>>>>>>>>> the back 
>>>>>>>>>>>> button and using the back command to manage the container inside 
>>>>>>>>>>>> the form.
>>>>>>>>>>>> So I have not to do this:
>>>>>>>>>>>>
>>>>>>>>>>>> if (isPortrait() && (*conditionsAreTrue*))
>>>>>>>>>>>> {
>>>>>>>>>>>> new EditingForm(appData,myData,mainForm,editingContainer,other 
>>>>>>>>>>>> parameters).show();
>>>>>>>>>>>> }
>>>>>>>>>>>> (this is what I am trying to do now)
>>>>>>>>>>>>
>>>>>>>>>>>> the form will be just used when a new screen has to be 
>>>>>>>>>>>> presented, like the help form.
>>>>>>>>>>>> Is it right?
>>>>>>>>>>>>
>>>>>>>>>>>> Il giorno martedì 15 settembre 2020 alle 03:50:41 UTC+2 Shai 
>>>>>>>>>>>> Almog ha scritto:
>>>>>>>>>>>>
>>>>>>>>>>>>> You can use setBackCommand and override the hardware back 
>>>>>>>>>>>>> command to have any functionality you want. It can just replace 
>>>>>>>>>>>>> containers 
>>>>>>>>>>>>> and then eventually move a form. You obviously need to keep track 
>>>>>>>>>>>>> of 
>>>>>>>>>>>>> everything which isn't simple. 
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Tuesday, September 15, 2020 at 12:48:15 AM UTC+3 P5music 
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> My app needs to manage cases where a back navigation occurs 
>>>>>>>>>>>>>> but not toward the original master/detail form, indeed to a 
>>>>>>>>>>>>>> different 
>>>>>>>>>>>>>> orientation of the editing view itself.
>>>>>>>>>>>>>> For example the editing view in portrait mode is fullscreen 
>>>>>>>>>>>>>> and can undergo a device rotation: in that case the landscape 
>>>>>>>>>>>>>> mode is the 
>>>>>>>>>>>>>> new full screen mode for the editing view, while master/detail 
>>>>>>>>>>>>>> is reached 
>>>>>>>>>>>>>> back only when further back navigation occurs when the user tap 
>>>>>>>>>>>>>> the back 
>>>>>>>>>>>>>> button.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> So I thought this has to be accompished with a new form: the 
>>>>>>>>>>>>>> editing form, to which the editing container is added, because I 
>>>>>>>>>>>>>> think it 
>>>>>>>>>>>>>> is the right way to manage back navigation, that is. navigation 
>>>>>>>>>>>>>> is between 
>>>>>>>>>>>>>> forms, back and forth.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I ask whether the editing container has to be recreated, or 
>>>>>>>>>>>>>> it can removed from the master/detail form and then added to the 
>>>>>>>>>>>>>> editing 
>>>>>>>>>>>>>> form.
>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Il giorno domenica 13 settembre 2020 alle 03:43:59 UTC+2 Shai 
>>>>>>>>>>>>>> Almog ha scritto:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I mean having containers side by side in one form (see the 
>>>>>>>>>>>>>>> kitchen sink where we do just that). 
>>>>>>>>>>>>>>> I don''t recommend having a form embedded in a form. Forms 
>>>>>>>>>>>>>>> are very "heavy" and things sometimes fail when you add a form 
>>>>>>>>>>>>>>> inside 
>>>>>>>>>>>>>>> another form. Historically this was prohibited (we'd throw an 
>>>>>>>>>>>>>>> exception in 
>>>>>>>>>>>>>>> that case) but some use cases for embedding a form do exist. 
>>>>>>>>>>>>>>> I'd still 
>>>>>>>>>>>>>>> avoid it when possible.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Saturday, September 12, 2020 at 12:31:31 PM UTC+3 P5music 
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks, do you mean having two forms side by side, that 
>>>>>>>>>>>>>>>> expands when in portrait mode going full screen singularly, or 
>>>>>>>>>>>>>>>> you mean 
>>>>>>>>>>>>>>>> that I open another form on top of the main form?
>>>>>>>>>>>>>>>> I started creating an editing container that can be added 
>>>>>>>>>>>>>>>> to the main form or to the editing form, so I remove all and 
>>>>>>>>>>>>>>>> then add 
>>>>>>>>>>>>>>>> again. Is this the right way to do that?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Il giorno sabato 12 settembre 2020 alle 07:04:13 UTC+2 Shai 
>>>>>>>>>>>>>>>> Almog ha scritto:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> In some cases you need two forms and in some cases two 
>>>>>>>>>>>>>>>>> containers. 
>>>>>>>>>>>>>>>>> The trick for doing this is to work with two containers 
>>>>>>>>>>>>>>>>> and when necessary wrap them in a Form to enable the two page 
>>>>>>>>>>>>>>>>> master detail.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Friday, September 11, 2020 at 3:41:56 PM UTC+3 P5music 
>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> My Codename app has master/detail layout.
>>>>>>>>>>>>>>>>>> According to orientation the detail (editing) or the 
>>>>>>>>>>>>>>>>>> master can stay full screen.
>>>>>>>>>>>>>>>>>> I have to handle many orientation and editing status 
>>>>>>>>>>>>>>>>>> configurations, so sometimes the editing screen will be 
>>>>>>>>>>>>>>>>>> displayed out of 
>>>>>>>>>>>>>>>>>> the master screen in portrait orientation.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> The back navigation (button and other gestures) has to be 
>>>>>>>>>>>>>>>>>> managed in both cases.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I am not sure if I have to use a main form and two 
>>>>>>>>>>>>>>>>>> containers, or instead two forms, that is, also an 
>>>>>>>>>>>>>>>>>> EditingForm with the 
>>>>>>>>>>>>>>>>>> EditingContainer inside.
>>>>>>>>>>>>>>>>>> Thanks in advance
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>

-- 
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/5c570b41-706e-47e3-ba7c-3a10dcecd952n%40googlegroups.com.

Reply via email to