B4J Question JavaFX Custom Control Access Methods

rwblinn

Well-Known Member
Licensed User
Longtime User
Hi,

developed (in java) my first working [not easy must say = sweat]) JavaFX Custom Control TextFieldNowWidget: An Anchorpane with a Label, TextField and Button (to set the actual date + time in the TextField). Methods defined are setLabel(String s), getText, getVersion.
1) Exported the Custom Control TextFieldNowWidget to a jar and copied to the B4J external libraries folder.
2) Build a B4J wrapper jTextFieldNowWidget for this Custom Control and copied to the B4J external libraries folder.
3) created a sample app in B4J using TextFieldNowWidget (added as additional jar) and jTextFieldNowWidget (added as a Lib).
To access TextFieldNowWidget in B4J, defined:
Code:
Sub Process_Globals
   Private textfieldnowwidget1 As Node
...

'Get the text from the inputfield
'Not found a way yet to directly access the methods by using textfieldnowwidget1.method, like textfieldnowwidget1.getText
Sub btnGetText_Action
   Dim jo As JavaObject = textfieldnowwidget1
   lblGetText.Text = jo.RunMethod("getText", Null)
   'JUST for a Test Log(jo.RunMethod("getVersion", Null))
End Sub

Question
Instead of using a JavaObject to access the TextFieldNow methods, like getText is there a way to use textfieldnowwidget1.getText?
What do I need to change in the Wrapper?

Pls find code attached.
 

Attachments

Hi Erel,

one jar is used for the JavaFX Scenebuilder (imported as Custom Control) and java apps using that custom control.
the other is a B4J wrapper (jar + xml) using that library (referenced in the eclipse project). The B4J wrapper shows only the standard node methods, but not the ones defined in the wrapper.
Something I do wrong or miss to include only the Custom Control methods. But do not know how to resolve?
 
Upvote 0
This code is taken from WebViewWrapper:
Code:
static {
     //This line ties the native WebView with this wrapper. It is required for the integration with Scene Builder (FXML layouts).
     PaneWrapper.nativeToWrapper.addFirst(new NativeAndWrapper(WebView.class, WebViewWrapper.class));
   }

You need to add a similar static constructor to your class if you want that your class will be instantiated during the layout building process.

The following method will be called:
Code:
@Override
   @Hide
   public void innerInitialize(final BA ba, final String eventName, boolean keepOldObject) {
     if (!keepOldObject)
       setObject(new WebView());
     super.innerInitialize(ba, eventName, true);
     if (ba.subExists(eventName + "_locationchanged")) {
       getObject().getEngine().locationProperty().addListener(new ChangeListener<String>() {

         @Override
         public void changed(ObservableValue<? extends String> arg0,
             String arg1, String arg2) {
           ba.raiseEventFromUI(getObject(), eventName + "_locationchanged", arg2);
         }
       });
     }
     if (ba.subExists(eventName + "_pagefinished")) {
       getObject().getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {

         @Override
         public void changed(ObservableValue<? extends State> arg0,
             State arg1, State arg2) {
           if (arg2 == State.SUCCEEDED) {
             ba.raiseEventFromUI(getObject(), eventName + "_pagefinished", getObject().getEngine().getLocation());
           }
         }
       });
     }
   }
 
Upvote 0
Thanks for feedback.

Explored further on how to create JavaFX Custom Controls and use these in B4J - afterall not that difficult.

For those interrested, two comprehensive JavaFX Custom Control examples (using Eclipse & B4J) developed while learning:
TextFieldClear with B4J Wrapper: here
TextFieldNow with B4J Wrapper: here
 
Upvote 0
Back
Top