Italian [Risolto] [B4J] Dialog Inputbox: errore

Aldo's

Active Member
Licensed User
Ho visto questo post qui.
Se provo a inserirlo in un qualsiasi punto mi da un errore:

Unexpected event (missing RaiseSynchronousEvents): mainform_focuschanged
java.lang.Exception: Stack trace
at java.base/java.lang.Thread.dumpStack(Thread.java:1387)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:199)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:167)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:109)
at anywheresoftware.b4a.shell.ShellBA.raiseEvent2(ShellBA.java:98)
at anywheresoftware.b4a.BA$1.run(BA.java:234)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._enterNestedEventLoopImpl(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._enterNestedEventLoop(WinApplication.java:201)
at javafx.graphics/com.sun.glass.ui.Application.enterNestedEventLoop(Application.java:509)
at javafx.graphics/com.sun.glass.ui.EventLoop.enter(EventLoop.java:107)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(QuantumToolkit.java:591)
at javafx.graphics/javafx.stage.Stage.showAndWait(Stage.java:465)
at javafx.controls/javafx.scene.control.HeavyweightDialog.showAndWait(HeavyweightDialog.java:162)

La mia idea è che sia necessario un WaitFor ma è un'intuizione sconclusionata.
Per favore mi aiutate a rendere operativo questo splendido strumento java?
 

LucaMs

Expert
Licensed User
Longtime User
Perché impiccarsi con JavaObject quando puoi usare semplicemente B4XDialog con un semplice B4XInputTemplate?
Fanno parte delle XUI Views:
B4X:
    Dim mB4XDialog As B4XDialog
    Dim InputTemplate As B4XInputTemplate
    
    InputTemplate.lblTitle.Text = "Titolo"
    InputTemplate.RegexPattern = "^[a-zA-Z]+$" ' facoltativo
    
    Wait For (mB4XDialog.ShowTemplate(InputTemplate, "OK", "", "CANCEL")) Complete (Result As Int)
    If Result = xui.DialogResponse_Positive Then
    End If
 

Aldo's

Active Member
Licensed User
Perché impiccarsi con JavaObject quando puoi usare semplicemente B4XDialog con un semplice B4XInputTemplate?
Immaginavo di ricevere questa risposta.
A dirla tutta esteticamente mi piace di più e mi da l'impressione che B4XDialog sia poco personalizzabile.
 

Star-Dust

Expert
Licensed User
Longtime User
Ho visto questo post qui.
Se provo a inserirlo in un qualsiasi punto mi da un errore:

Unexpected event (missing RaiseSynchronousEvents): mainform_focuschanged
java.lang.Exception: Stack trace
at java.base/java.lang.Thread.dumpStack(Thread.java:1387)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:199)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:167)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:109)
at anywheresoftware.b4a.shell.ShellBA.raiseEvent2(ShellBA.java:98)
at anywheresoftware.b4a.BA$1.run(BA.java:234)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._enterNestedEventLoopImpl(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._enterNestedEventLoop(WinApplication.java:201)
at javafx.graphics/com.sun.glass.ui.Application.enterNestedEventLoop(Application.java:509)
at javafx.graphics/com.sun.glass.ui.EventLoop.enter(EventLoop.java:107)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(QuantumToolkit.java:591)
at javafx.graphics/javafx.stage.Stage.showAndWait(Stage.java:465)
at javafx.controls/javafx.scene.control.HeavyweightDialog.showAndWait(HeavyweightDialog.java:162)

La mia idea è che sia necessario un WaitFor ma è un'intuizione sconclusionata.
Per favore mi aiutate a rendere operativo questo splendido strumento java?
Quello che stai inizializzando con JavaObject è un form. Sta cercando un evento che non hai creato.

Purtroppo adesso sono fuori sede e non posso aiutarti.
 

LucaMs

Expert
Licensed User
Longtime User
e mi da l'impressione che B4XDialog sia poco personalizzabile.
1.gif


(Considera che non sono esattamente un artista, eh! ?)

E considera anche che funzionerebbe così com'è su B4J, B4A e B4I.
 

Aldo's

Active Member
Licensed User
Ho provato a lavorare un po' con B4XDialog, ho fatto un po' di prove e vi metto il codice:
B4X:
    Dim mB4XDialog As B4XDialog
    Dim InputTemplate As B4XInputTemplate
    mB4XDialog.Initialize(Root)
'    Barra del titolo
    mB4XDialog.TitleBarColor=xui.Color_Blue
    mB4XDialog.TitleBarTextColor=xui.Color_Black
    mB4XDialog.Title="TITOLO"
'    Bordo del dialog
    mB4XDialog.BorderColor=xui.Color_Black
    mB4XDialog.BorderCornersRadius=4
    mB4XDialog.BorderWidth=1   
'    Sfondo del dialog
    mB4XDialog.BlurBackground=True   
    mB4XDialog.BackgroundColor=xui.Color_LightGray
'    Bottoni
    mB4XDialog.ButtonsColor=xui.Color_LightGray
    mB4XDialog.ButtonsTextColor=xui.Color_Black
    mB4XDialog.ButtonsHeight=40
'    Riga di controllo
    InputTemplate.Initialize
    InputTemplate.lblTitle.TextColor=xui.Color_Black
    InputTemplate.lblTitle.Color=xui.Color_LightGray
    InputTemplate.lblTitle.Text=lblData.Text
    InputTemplate.SetBorderColor(xui.Color_Black,xui.Color_Black)
    InputTemplate.mBase.Color=xui.Color_LightGray
        
    Wait For (mB4XDialog.ShowTemplate(InputTemplate, "OK", "", "CANCEL")) Complete (Result As Int)
    If Result = xui.DialogResponse_Positive Then
    
    End If
Però non capisco come generare la inputbox con un font nero.
 

LucaMs

Expert
Licensed User
Longtime User
Ho provato a lavorare un po' con B4XDialog, ho fatto un po' di prove
Anche le mie sono state prove al volo, quindi quello che allego non è certo il meglio che sia possibile fare ed ottenere, anzi.
Già il fatto che il codice stia nell'evento click di un Button è "orripilante"; si potrebbero creare N classi, ognuna con un tipo personalizzato di dialog, con proprietà varie per colori e magari immagini.
 

Attachments

  • CustomB4XDialog.zip
    13.2 KB · Views: 116

Aldo's

Active Member
Licensed User
Alla fine, partendo dall'esempio di LucaMs, ma non volendo costruire un layout per una dialog sono riuscito ad ottenere questo:
Immagine.png

con questo codice:
B4X:
Private Sub Button1_Click
    Dim mB4XDialog As B4XDialog
    Dim InputTemplate As B4XInputTemplate
    mB4XDialog.Initialize(Root)
'    Bordo del dialog
    mB4XDialog.BorderColor=xui.Color_Black
    mB4XDialog.BorderCornersRadius=4
    mB4XDialog.BorderWidth=1
'    Sfondo del dialog
    mB4XDialog.BlurBackground=True
    mB4XDialog.BackgroundColor=xui.Color_White
'    Barra del titolo
    mB4XDialog.TitleBarColor=xui.Color_Blue
    mB4XDialog.TitleBarTextColor=xui.Color_Black
    mB4XDialog.Title="TITOLO"
'    Bottoni
    mB4XDialog.ButtonsColor=xui.Color_LightGray
    mB4XDialog.ButtonsTextColor=xui.Color_Black
    mB4XDialog.ButtonsHeight=35
'    Riga di controllo   
    Dim fx As JFX
    InputTemplate.Initialize
    InputTemplate.lblTitle.TextColor=xui.Color_Black
    InputTemplate.lblTitle.Color=xui.Color_White
    InputTemplate.lblTitle.Font = fx.CreateFont("Arial",14,False,False)
    InputTemplate.lblTitle.Text="RIGA DI CONTROLLO"
'    Campo da riempire
    InputTemplate.SetBorderColor(xui.Color_Black,xui.Color_Black)
    InputTemplate.TextField1.As(TextField).Text=""
    InputTemplate.TextField1.SetColorAndBorder(xui.Color_White,1,xui.Color_Black,0)
    InputTemplate.TextField1.TextColor=xui.Color_Black
    Wait For (mB4XDialog.ShowTemplate(InputTemplate, "OK", "", "CANCEL")) Complete (Result As Int)
    If Result = xui.DialogResponse_Positive Then
        Log(InputTemplate.Text)
    End If
End Sub

Spero possa servire...
...a me si.
 

Aldo's

Active Member
Licensed User
Se eviti di usare FX sarà codice multipiattaforma.
Come faccio a usare la funzione .Font senza FX? Tutte le buone idee sono benvenute, come vedi.
 

Aldo's

Active Member
Licensed User
Non lo vedo; nel senso che non vedo i tuoi Like ? (scherzo, ovviamente; finché Erel non pagherà i Like, non credo siano utilissimi, anche se fanno piacere).
Ops... ora ti ho riempito di like ?
 
Top