Culjko
Member
I need a function to monitor changes in folders, I found on the internet that it could be done like this:
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?
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?