Bug? Getting a Menu from Menu.MenuItems.Get returns an error.

LWGShane

Well-Known Member
Licensed User
Longtime User
This code:
B4X:
Public Sub GetMenu (M As Menu, MenuText As String) As Menu
    For i = 0 To M.MenuItems.Size - 1
        Dim TheMenu As Menu = M.MenuItems.Get(i)
        If TheMenu.Text.Contains(MenuText) Then Return TheMenu
    Next
    Return Null
End Sub

Produces the following error:

Waiting for debugger to connect...
Program started.
Error occurred on line: 60 (EasyMenu)
java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.control.Menu
at b4j.example.easymenu._getmenu(easymenu.java:218)
at b4j.example.main._initmenu(main.java:179)
at b4j.example.main._appstart(main.java:114)
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:498)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:614)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:231)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:159)
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:498)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:90)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:93)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:77)
at b4j.example.main.start(main.java:38)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)

The one small problem? I'm not casting a MenuItem to a Menu. I'm casting a Menu to a Menu.
 

LWGShane

Well-Known Member
Licensed User
Longtime User
@Erel - Done; project is attached.
 

Attachments

  • UFOLauncher.zip
    4.5 KB · Views: 199

LWGShane

Well-Known Member
Licensed User
Longtime User
@Erel - Here's the output:

B4X:
Waiting for debugger to connect...
Program started.
Menu@5e775c93[styleClass=[menu-item, menu]]
javafx.scene.control.Menu
Menu@19cfd5ca[styleClass=[menu-item, menu]]
javafx.scene.control.Menu
Menu@49657875[styleClass=[menu-item, menu]]
javafx.scene.control.Menu

I'm using the following code to get the output:

B4X:
Dim EM As EasyMenu
EM.Initialize(Me)
Dim Bar As MenuBar
Bar.Initialize("")
 
Dim PikminMenu As Menu
PikminMenu.Initialize("Pikmin Menu", "")
EM.BuildMenu(PikminMenu, CreateMap("Pikmin":EM.TypeMenu, "Treasures":EM.TypeMenu, "Players":EM.TypeMenu))
EM.GetMenu(PikminMenu,"")
 

LWGShane

Well-Known Member
Licensed User
Longtime User
@Erel - You're right; the output did contain a MenuItem so I fixed the error with the following code:

B4X:
Public Sub GetMenu (M As Menu, MenuText As String) As Menu
    For Each O As Object In M.MenuItems
        If GetType(O).Contains("javafx.scene.control.MenuItem") = False Then
            Dim TheMenu As Menu = O
            If TheMenu.Text.Contains(MenuText) Then Return TheMenu
        End If
    Next
    Return Null
End Sub
 
Top