B4J Question Monitoring folders

Culjko

Member
I need a function to monitor changes in folders, I found on the internet that it could be done like this:

B4X:
Sub Class_Globals
    Private monitoring As Boolean
    Private folderHasChange As Boolean
    Private ws As JavaObject
    Private ENTRY_CREATE As JavaObject
    Private ENTRY_DELETE As JavaObject
    Private ENTRY_MODIFY As JavaObject
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
    
    Dim kinds As JavaObject
    kinds.InitializeStatic("java.nio.file.StandardWatchEventKinds")
    ENTRY_CREATE = kinds.GetField("ENTRY_CREATE")
    ENTRY_DELETE = kinds.GetField("ENTRY_DELETE")
    ENTRY_MODIFY = kinds.GetField("ENTRY_MODIFY")
    folderHasChange = False
End Sub

Sub StartFolderMonitoring(folderPath As String)
    monitoring = True
    folderHasChange = False
    Dim jo As JavaObject
    Dim Paths As JavaObject
    Dim path As JavaObject

    ws = jo.InitializeStatic("java.nio.file.FileSystems").RunMethodJO("getDefault", Null).RunMethodJO("newWatchService", Null)
    
    Dim Paths As JavaObject
    Dim path As JavaObject
    Paths.InitializeStatic("java.nio.file.Paths")
    [B]path = Paths.RunMethodJO("get", Array As Object(folderPath))[/B]
    
    
'    Paths = jo.InitializeStatic("java.nio.file.Paths")
'    path = Paths.RunMethodJO("get", Array(folderPath, Null))

    path.RunMethodJO("register", Array(ws, Array As Object(ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY)))

    ' Poziv ResumableSub kao petlje
    MonitorLoop
End Sub

Sub MonitorLoop As ResumableSub
    Do While monitoring
        Try
            Dim key As JavaObject = ws.RunMethod("take", Null)
            Dim events As List = key.RunMethod("pollEvents", Null)
            For Each e As JavaObject In events
                Dim kind As String = e.RunMethodJO("kind", Null).RunMethod("name", Null)
                Dim filename As String = e.RunMethodJO("context", Null).RunMethod("toString", Null)
                Log($"Promena: ${kind}, Fajl: ${filename}"$)
            Next
            key.RunMethod("reset", Null)
        Catch
            Log(LastException)
            Exit
        End Try
        ' Ne blokira GUI, daje priliku drugim procesima
        Sleep(100)
    Loop
    Return Null
End Sub

Sub StopMonitoring
    monitoring = False
    If ws.IsInitialized Then ws.RunMethod("close", Null)
End Sub

When I run the application it gives an error in this line :
path = Paths.RunMethodJO("get", Array As Object(folderPath))

Waiting for debugger to connect...
Program started.
Call B4XPages.GetManager.LogEvents = True to enable logging B4XPages events.
2025-04-23 21:53:01.529:INFO::JavaFX Application Thread: Logging initialized @1738ms to org.eclipse.jetty.util.log.StdErrLog
Error occurred on line: 33 (monitoringFolders)
java.lang.RuntimeException: Method: get not matched.
at anywheresoftware.b4j.object.JavaObject.RunMethod(JavaObject.java:130)
at anywheresoftware.b4j.object.JavaObject.RunMethodJO(JavaObject.java:139)
at b4j.example.monitoringfolders._startfoldermonitoring(monitoringfolders.java:114)
at b4j.example.main._initializeserver(main.java:127)
at b4j.example.main._appstart(main.java:92)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:629)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:237)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:167)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:111)
at anywheresoftware.b4a.shell.ShellBA.raiseEvent2(ShellBA.java:100)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:98)
at b4j.example.main.start(main.java:38)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:1589)

Could someone help me figure out how to solve this?
 
Top