WebEngine: how to capture the click on a link?

I need some insight into the inner workings of WebEngine: listeners seem to stop firing under certain conditions.
Problem description:
In my application I have to open certain urls in a new tab or in a different pane. Following jsmith's proposal in a different thread (Re: How to cancel page loading in WebView? I do the following:
- Based on the location of the link clicked, I decide if it has to be opened in place, in a new tab, or in a sort of popup pane (similar to a sheet window in MacOS/X as a fake modal dialog attached to the top of the window).
- To achieve this, I implement a locationProperty listener using "locationProperty().addListener".
- Inside the listener I use "getLoadWorker().cancel()" to stop the current engine from loading the url ...
- ... and load that url in a new tab or the popup pane.
This works fine, but when I return from the other tab or close the popup pane, the location property listener won't fire any more.
The same applies if I cancel in a stateProperty change listener.
Workaround:
As a workaround I can refresh the page using "getEngine().reload()" in a "Platform.runLater" thread, but the flickering is really ugly.
Analysis:
It looks as if the cancel comes too late. The first opportunity to capture the click on a link seems to be "getLoadWorker().stateProperty()" where "Worker.State" is "SCHEDULED"; after that fires the listener on "locationProperty()". In either case "getLoadWorker().cancel()" seems to invalidate the listeners.
I have experimented with another development platform which also uses Webkit. There it's possible to truely cancel out before a link is loaded. So it should be possible in JavaFX as well...
Question:
Does somebody know how I can capture the click on a link without redeveloping the web application (which I can't)?
Cheers,
Thomas

If, after calling getLoadWorker().cancel(), you no longer receive location change notifications upon further clicks on links, it looks like a bug. Feel free to file an issue with Jira.
However, it is probably too fragile to rely on the location property and the cancel method in your case, due to asynchronous nature of page loads.
Look at the WebEngine.createPopupHandler property. The popup handler will only be called if the page decides that a new window needs to be created, so it may not be able to help you fully solve your problem, but it may be worth a try.
Otherwise, consider the approach suggested by irond13. Install DOM event listeners on link objects (<a> tags) and do whatever you want in response to click events. You can do it solely in Java, see Re: Controlling what happens when a user clicks on a hyperlink in a WebView and Re: Communicate from WebView to JavaFX scene for details and example.
Finally, if you do think a more direct callback on WebEngine is a necessity, consider extending http://javafx-jira.kenai.com/browse/RT-17073 or filing a new feature request.

Similar Messages

  • How to capture the Logout time in xMII

    Hi Friends,
    How to capture the logout time in xMII when the user clicks on Logout link
    Thanks

    Srikanth,
    It would be better to use a database table(s) to store your audit trail information than an xml file, which could grow beyond a manageable size and then require housekeeping efforts and file rolling, etc.  It would also be much easier to query user related information out of the logs, pareto charts for failed vs. successful login attempts, etc. if the data was stored in a database.
    Have you considered modifying the Relogin.jsp page link in the portal's sub-menu bar?  How about making your own version of this web page and changing the link pointer?  Keep in mind that whatever result you come up with here will need a significant update for NetWeaver UME compatibility in version 12.0.
    Regards,
    Jeremy

  • How to Capture the Objects in Object Library in Openscript tool?

    Hi All,
    I am new to OATS and i was trying to explore the Object Library in Opencript tool.
    Can anyone please advise me how to capture the Oracle forms Object in Object Library or Object Repository using OpenScript Tool?
    It would be grateful,If you can provide me the step to follow for the above.
    Thanks
    Ajith

    Hi Ajith,
    Create one Object Library. In OpenScript click File -> New -> Select Object Library under Script Assets.
    Then mention name of your library and save it.
    Add this library to script assets of your script. Select Script -> Script Properties... -> Script Assets -> Object Library -> Add(button) -> select your Object Library.
    Then save  your script and start recording. After recording you can see xpath of all objects you interacted with during your script recording.
    If you want to apply this to your script, select Script -> Apply Object Library.. -> then select your Object Library. If you want to revert it, then select Script --> Revert All Navigation To Recorded
    Hope this will help you...
    Regards,
    Deepu M

  • How to capture the parameter in webdynpro application?

    Hi ,
    We have a requirement like this :
    the scenario is :
    user will get a mail to  inbox(here mail is coming from SAP Workflow) saying that :"proposal is waiting for your approval".for details please click on the below link:
    once user clicks on the link it has to open up the webdynpro application and has to display the details of the particular proposal no.
    how to pass the proposal no to the webdynpro application URL and how to capture the proposalno in webdynpro java?
    Thanks in advance.
    Regards,
    Pavani

    From the workflow when you create the link, also add the proposal number as an url parameter.
    For example if the url for requesting WD application is <WD_URL>, then URL with parameter would be
    <WD_URL>?PROPOSAL_NO=<actual_proposal_number>
    In the webdynpro, you can access this parameter with the following piece of code(ideally in wdDoInit of component controller).
    String proposalNo = WDProtocolAdapter.getProtocolAdapter().getRequestObject().getParameter("PROPOSAL_NO");
    Regards
    kk..

  • Flex 3 : How  to capture   right click on DataGrid ??

    I am using Flex 3 . I have some data inside a DataGrid .
    Now when we the user right clicks on Datagrid Item , i want to show an Alert ??How  to capture 
    right click on DataGrid ??
    Please suggest ,thanks

    Thanks for the resonse , I did not understand what is context menu and how it it associated with Datagrid's right click , could you please elobrate ?? Thanks .

  • How to capture the screen and send it to attachment for that mail

    hi sir ,
         how to capture the screen shot and attach with that e-mail , whether it is possible or not ..
    Regards,
    kumar

    hi sir,
        i am asking about while creating the support message from help menu in sap..
    while creating the support message we have to give component , priority and text also .. after that click the send icon in that support desk message .. while clicking the send button the entire screen ( what  we have entered in that creen na ) i have to capture the screen ( it may be save in local file also )  after that it will attach into attachment and then send it to ...
    Regards,
    kumar

  • How to capture previously clicked button(previous event)?

    Hi guyz,
    I have frame in which i have different panels. I would like to capture the last clicked button. My objective is to bring a pop-up box(dialog) when anything other than a specific button is clicked in one of the panels. So, i would like to know if i can see what button was clicked previously. Does anyone know?

    How to capture previously clicked button(previous event)?Store it somewhere and then you can use it later:
    ActionListener previousActionEvent;
    JButton b = new JButton();
    b.addActionListener(new ActionListener(){
       public void actionPerformed(ActionEvent evt){
          previousActionEvent = evt;
    });

  • How to capture the values given in SSC1 transcation?

    Hello All,
    Can anyone suggest me, how to capture the values given in SSC1 transaction?

    Hello Clemens Li,
    Requirement: Integration of SAP Appointment Calendar with Gmail Calendar
    If I create an appointment in SSC1 transaction, it will appear in SAP Appointment calendar. The same thing should get updated in Gmail calendar of SAP user and also in the guest Gmail calendar if exists in appointment.
    So, I have to capture the input values given in SSC1 transaction while creating an appointment in SAP and try to export those values to web services using some function module.  Sending those values to web services completes my task.
    Means, if I create an appointment in SAP, at the same time, the values which I gave must get exported to some object. So that I can send them to web services.
    But my actual problem is with capturing the input values given to SSC1 transaction.
    How can I get those values out to some internal table?
    Another one is, I did not found any BADI to enhance SSC1 transaction so that I can include my code there.
    If you know any enhancements in SSC1, please let me know.
    If you want any more clarification, please let me know.
    Thanks for the response
    DNR Varma

  • How to capture the current info in the top-of-page event in Reuse block dis

    How to capture the current info in the top-of-page event in Reuse block dis

    Hi Geetha,
         If you don't have any information to pass the Heading Block, then why you are using this event ?
         please comment/ remove that TOP_OF_PAGE code. and use subtotal code in field catalog block.
          you can use below code for subtotal. 
          FORM field_catalog .
                    gs_fcat-do_sum = &2.
              fcat : 'WRBTR' '15' 'X' ' ' ' ' 'WRBTR' 'Amount',
           ENDFORM.
           Regards,
           Kunjan

  • How to capture the data entered in a textfield in a JTable

    How to capture the data entered in a textfield present in a cell of a textfield or how to add listener to this textfield

    A sample of my code is:
              model = new GridDisplayTableModel(gridDisp,columnName,getRows(),getCols());
              final ComboRenderer cRenderer = new ComboRenderer();
              final TextFieldRenderer tRenderer = new TextFieldRenderer();
              combo.addItem("one");
              combo.addItem("two");
              combo.addItem("three");
              final JTextField textfield = new JTextField();
              final DefaultCellEditor cmbEditor = new DefaultCellEditor(combo);
         //     final JEnterDataCellEditor textEditor = new JEnterDataCellEditor(12);
              final DefaultCellEditor textEditor = new DefaultCellEditor(textfield);
              rm = new RowEditorModel();
              table = new JTable(model){
         public TableCellRenderer getCellRenderer(int row, int column) {
              int posx = 0;
                   int posy = 0;
                   TableCellRenderer renderer = null;
         for(int l=0;l<getDataVec().size();l++)
                   beanObj =(Helperbean)dataVec.elementAt(l);
                   posx = beanObj.getPosx();
                   posy = beanObj.getPosy();
                   if(row==posx && column==posy)
                             if(beanObj.getModeofDisplay() != null && beanObj.getModeofDisplay().equalsIgnoreCase("textfield"))
                                  rm.addEditorForRow(row,textEditor);
                                  renderer = tRenderer;
                             else if(beanObj.getModeofDisplay() != null && beanObj.getModeofDisplay().equalsIgnoreCase("combo"))
                                  rm.addEditorForRow(row,cmbEditor);
                                  renderer = cRenderer;
                             break;
                        renderer = super.getCellRenderer(row, column);
              //     System.out.println("getEditor"+rm.getEditor(1));
         return renderer;
    public TableCellEditor getCellEditor(int row, int col) {   
         int posx = 0;
         int posy = 0;
         TableCellEditor tmpEditor = null;
    for(int l=0;l<getDataVec().size();l++)
         beanObj =(Helperbean)dataVec.elementAt(l);
         posx = beanObj.getPosx();
         posy = beanObj.getPosy();
         if(row==posx && col==posy)
                   if(beanObj.getModeofDisplay() != null && beanObj.getModeofDisplay().equalsIgnoreCase("textfield"))
                        System.out.println("celleditorval "+textEditor.getCellEditorValue());
                        tmpEditor = textEditor;
                   else if(beanObj.getModeofDisplay() != null && beanObj.getModeofDisplay().equalsIgnoreCase("combo"))
                        tmpEditor = cmbEditor;
                   break;
              tmpEditor = super.getCellEditor(row, col);
    return tmpEditor;
    public boolean isCellEditable(int row,int col){
         boolean isEditable = false;
         int posx = 0;
         int posy = 0;
    for(int l=0;l<getDataVec().size();l++)
         beanObj =(Helperbean)dataVec.elementAt(l);
         posx = beanObj.getPosx();
         posy = beanObj.getPosy();
         if(row==posx && col==posy)
              if(beanObj.getModeofDisplay() != null )     
                        isEditable = true;     
                   else
                        isEditable = false;     
                   break;
         isEditable = false;
         return isEditable;
    public void changeSelection(final int row, final int column, boolean toggle, boolean extend) {
         super.changeSelection(row, column, toggle, extend);
         //my attempt to avoid editCellAt from being called twice in a row
         if (getModel().isCellEditable(row, column) && !(isEditing() && getEditingRow() == row && getEditingColumn() == column))
              if (editCellAt(row, column)) {
                   getEditorComponent().requestFocus();
         // Select the text when the cell starts editing
    public boolean editCellAt(int row, int column) {       
         boolean result = super.editCellAt(row, column);
         final Component editor = getEditorComponent();
         if (editor != null && editor instanceof JTextField) {           
              SwingUtilities.invokeLater(new Runnable() {               
                   public void run() {                   
                        ((JTextField)editor).selectAll();
              return result;
         public boolean hasFocus()
              Component editorComponent = getEditorComponent();
              // Try to install the editor
              int anchorRow = getSelectionModel().getAnchorSelectionIndex();
              int anchorColumn = getColumnModel().getSelectionModel().
              getAnchorSelectionIndex();
              if (anchorRow != -1 && anchorColumn != -1 && !isEditing())
              if ((this.getSelectedRow() == anchorRow) && (this.getSelectedColumn() == anchorColumn))
              if (!editCellAt(anchorRow, anchorColumn)) {}
              return super.hasFocus();
         public void valueChanged(ListSelectionEvent e)
              super.valueChanged(e);
              if ((this.getSelectedRow() == 2) && (this.getSelectedColumn() == 3))
                   DefaultFocusManager focusManager = new DefaultFocusManager();
                   focusManager.focusNextComponent(this);
                   model.fireTableStructureChanged();
         

  • How to capture the event in ALV grid display?

    Hi experts,
      How to capture the event in an ALV grid display which is editable. I have to capture the TAB key or ENTER key.
    regards,
    Arul Jothi.

    Hi Arul,
    Take a look at sample program BCALV_EDIT_03. (Find string "register ENTER" in the program to see how to register)
    Basically you have to Register edit events using method call REGISTER_EDIT_EVENT and then write a handler method for event DATA_CHANGED..
    If you are using a REUSE..GRID fm then first get the grid reference using function module GET_GLOBALS_FROM_SLVC_FULLSCR and then repeat the above procedure..
    Hope this helps..
    Sri
    Message was edited by: Srikanth Pinnamaneni

  • How to capture the changes in ppoma_crm transaction

    Hello All,
    We have a requirement that if we add either a BP or an User to a positon in ppoma_crm transaction then we should be able to update these entries in our z table.
    If it is a BP then we should look for the User mapped to it and update the z table else we should directly update the z tables with user name.
    But we are facing an issue in capturing the values that have been updated.
    Can anyone tell me how to capture the new values in the BADI for the ppoma_crm transaction ?
    Regards
    Sohit

    Did any guys here face the requirement? If replicating all the columns some of which may change frequently but are not important to the other sites, then i wouldn't replicate these changes in order to improve the performance. Thanks for your help!

  • How to capture the first execution of a report

    Hi,
    I am executing a report in background. The first time the report is executed I have to do a different processing. After the 1st execution I have to different processing.
    Someone please tell me how to capture the 1st execution of a report. Is there a system variable ?
    Appreciate your <removed by moderator> response.
    Thanks,
    Dikshitha G
    Edited by: Thomas Zloch on May 12, 2011 11:36 AM

    Keshav.T wrote:
    Are you going to create a Z table for this ???? ... Is there nobody to advice you in your firm ???
    Hello Keshav,
    A couple of years ago i would have recommended using the INDX table, but it has got it's demerits.
    Maintenance of Z-table is easier than the INDX table. Say there is some error in the program & you want to override the flag. Will it be easier to do so in the INDX table or via SM30 for the Z-Table?
    As a matter-of-fact i will recommend using the solution provided by Florian the TVARVC technique.
    1. Create a parameter(specific to your program) & transport it.(See the trxn STVARV)
    2. In your program check the value of this param & set it accordingly.
    Using TVARVC you will 2 birds with one stone:
    1. You don't have to create a custom table.
    2. Easy maintenance via STVARV trxn.
    Hope you get the point!
    Cheers,
    Suhas
    PS: In our system we have a Z-table designed specifically for this particular purpose. All the programs having this kind of requirement refer to this table.

  • How to capture the date and time of  a background job

    Hi experts,
    How to capture the date and time of  a background job?
    How to find whether it is runned succesfully or not?
    If it is not successful how to put error message?
    ASAP
    Thanx in advance,
    Sudha

    To Display the STATUS of the JOB which is exectued in background
      CLEAR : wa_jobsteplist.
      REFRESH : i_jobsteplist.
      WRITE:/ 'DISPLAYING JOB STATUS'.
      CALL FUNCTION 'BP_JOB_READ'
        EXPORTING
          job_read_jobcount           = w_jobcount
          job_read_jobname            = w_jobname
          job_read_opcode             = '20'
        JOB_STEP_NUMBER             =
       IMPORTING
         job_read_jobhead            = wa_jobhead
       TABLES
         job_read_steplist           = i_jobsteplist
    CHANGING
       RET                         =
       EXCEPTIONS
         invalid_opcode              = 1
         job_doesnt_exist            = 2
         job_doesnt_have_steps       = 3
         OTHERS                      = 4
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    To Display the status text as per the status type
      CASE wa_jobhead-status.
        WHEN 'S'. WRITE: / 'Scheduled'.
        WHEN 'R'. WRITE: / 'Released'.
        WHEN 'F'. WRITE: / 'Completed'.
        WHEN 'A'. WRITE: / 'Cancelled'.
        WHEN OTHERS.
      ENDCASE.

  • How to capture the string values

    Hi Gurus,
    Could you plz suggest me how to capture the string value.
    My requirement is.
    I have a structure field called  cnj_stat-sttxt_int and it is storing a value like "REL CDRT AVAC". AND the moddile value CDRT will change according to condtions. now i required to write a logic like if cnj_stat-sttxt_int field contain 'REL' and 'AVAC'.  I HAVE TO THROW SOME ERROR.
    SO please give some idea about on it...
    Its urgent..
    points will be rewarded...
    Thanks in advance!!!!
    Thanks & regards,
    Kranthi.

    if cnj_stat-sttxt_int field contain 'REL' and 'AVAC'. I HAVE TO THROW SOME ERROR.
    if cnj_stat-sttxt_int CS 'REL' and cnj_stat-sttxt_int CS 'AVAC'.
    THROW SOME ERROR.
    endif.

Maybe you are looking for

  • Unicode conversion errors

    Hello everyone, I´m working with a subroutine for testing Unicode in our programs. In UTF-8 there´s no problem. Then I switched the keyboard, language and location in my computer´s settings to czech and try to upload czech texts to UNIX directory lik

  • What should i choose XLIFF or TL tables in database?

    Hello friends, What is the best way to translate codes what i have in database? For better understanding e.g: i have an item/product status code in my DB table: item, status_code, completed_flag Laptop, DELIVERY,N Assume In UI i have ViewObject calle

  • EM Configuration issue.

    I have installed grid agent on different server. When i ran emctl status agent i am getting below error. EM Configuration issue. /u01/app/oracle/product/10g/hostname.com_ORCL. OS is AIX Thanks in advance...

  • Get only strings from Varchar2 Column

    Hi, How can I extract only strings form varchar2 type column? I have data like below. 25-Abc xy 233-xyz jj x23A 9-dd 5-aaa(pp) I need following outputs (- also be removed) Abc xy xyz jj xA dd aaa(pp) Thanks, Sujnan

  • 0CRM infoprovider usage in BW/BI

    Hi Experts,                 We have an infoprovider 0CRM in our BI infoprovider list, we are planning to extract CRM datas to BI system so how can i make use of this infoprovider. Infoprovider 0CRM has lots of useful infoobjects on the functional asp