Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8213733

JavaFX WebView don't manage touch scroll if inserted in JFXPanel

    Details

    • Subcomponent:
    • CPU:
      x86_64
    • OS:
      generic

      Description

      ADDITIONAL SYSTEM INFORMATION :
      Windows 10 64 bit + jre/jdk 1.8.0.192

      A DESCRIPTION OF THE PROBLEM :
      If WebView is placed on JFXPanel its WebPage does'nt manage correctly scroll dona by mouse dragge or by touch screen. If WebView is instead attached directly to an application scroll is correctly manage even though done by touch or mouse dragged.
      To replicate the issue please I run code coming from Oracle javafx tutorial pages , find below links for working and not working application:
      Swing application where touch scroll doesn't work: https://docs.oracle.com/javafx/2/swing/SimpleSwingBrowser.java.htm
      JavaFX application where touch scroll works:
      https://docs.oracle.com/javafx/2/webview/WebViewSample.java.htm



      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Just run the attached code code or create a swing application that keep a jfxpanel with webView inside


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      I expect that, using atouch screen, web page could be scrolled moving fingers through the screen
      ACTUAL -
      web page content is selected and view doesn't scroll

      ---------- BEGIN SOURCE ----------

      import javafx.application.Platform;
      import javafx.beans.value.ChangeListener;
      import javafx.beans.value.ObservableValue;
      import javafx.embed.swing.JFXPanel;
      import javafx.event.EventHandler;
      import javafx.scene.Scene;
      import javafx.scene.web.WebEngine;
      import javafx.scene.web.WebEvent;
      import javafx.scene.web.WebView;
       
      import javax.swing.*;
      import java.awt.*;
      import java.awt.event.*;
      import java.net.MalformedURLException;
      import java.net.URL;
       
      import static javafx.concurrent.Worker.State.FAILED;
        
      public class SimpleSwingBrowser extends JFrame {
       
          private final JFXPanel jfxPanel = new JFXPanel();
          private WebEngine engine;
       
          private final JPanel panel = new JPanel(new BorderLayout());
          private final JLabel lblStatus = new JLabel();


          private final JButton btnGo = new JButton("Go");
          private final JTextField txtURL = new JTextField();
          private final JProgressBar progressBar = new JProgressBar();
       
          public SimpleSwingBrowser() {
              super();
              initComponents();
          }

          
          private void initComponents() {
              createScene();
       
              ActionListener al = new ActionListener() {
                  @Override
                  public void actionPerformed(ActionEvent e) {
                      loadURL(txtURL.getText());
                  }
              };
       
              btnGo.addActionListener(al);
              txtURL.addActionListener(al);
        
              progressBar.setPreferredSize(new Dimension(150, 18));
              progressBar.setStringPainted(true);
        
              JPanel topBar = new JPanel(new BorderLayout(5, 0));
              topBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
              topBar.add(txtURL, BorderLayout.CENTER);
              topBar.add(btnGo, BorderLayout.EAST);
       
              JPanel statusBar = new JPanel(new BorderLayout(5, 0));
              statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
              statusBar.add(lblStatus, BorderLayout.CENTER);
              statusBar.add(progressBar, BorderLayout.EAST);
       
              panel.add(topBar, BorderLayout.NORTH);
              panel.add(jfxPanel, BorderLayout.CENTER);
              panel.add(statusBar, BorderLayout.SOUTH);
              
              getContentPane().add(panel);
              
              setPreferredSize(new Dimension(1024, 600));
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              pack();

          }
       
          private void createScene() {
       
              Platform.runLater(new Runnable() {
                  @Override
                  public void run() {
       
                      WebView view = new WebView();
                      engine = view.getEngine();
       
                      engine.titleProperty().addListener(new ChangeListener<String>() {
                          @Override
                          public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) {
                              SwingUtilities.invokeLater(new Runnable() {
                                  @Override
                                  public void run() {
                                      SimpleSwingBrowser.this.setTitle(newValue);
                                  }
                              });
                          }
                      });
       
                      engine.setOnStatusChanged(new EventHandler<WebEvent<String>>() {
                          @Override
                          public void handle(final WebEvent<String> event) {
                              SwingUtilities.invokeLater(new Runnable() {
                                  @Override
                                  public void run() {
                                      lblStatus.setText(event.getData());
                                  }
                              });
                          }
                      });
       
                      engine.locationProperty().addListener(new ChangeListener<String>() {
                          @Override
                          public void changed(ObservableValue<? extends String> ov, String oldValue, final String newValue) {
                              SwingUtilities.invokeLater(new Runnable() {
                                  @Override
                                  public void run() {
                                      txtURL.setText(newValue);
                                  }
                              });
                          }
                      });
       
                      engine.getLoadWorker().workDoneProperty().addListener(new ChangeListener<Number>() {
                          @Override
                          public void changed(ObservableValue<? extends Number> observableValue, Number oldValue, final Number newValue) {
                              SwingUtilities.invokeLater(new Runnable() {
                                  @Override
                                  public void run() {
                                      progressBar.setValue(newValue.intValue());
                                  }
                              });
                          }
                      });

                      engine.getLoadWorker()
                              .exceptionProperty()
                              .addListener(new ChangeListener<Throwable>() {
       
                                  public void changed(ObservableValue<? extends Throwable> o, Throwable old, final Throwable value) {
                                      if (engine.getLoadWorker().getState() == FAILED) {
                                          SwingUtilities.invokeLater(new Runnable() {
                                              @Override public void run() {
                                                  JOptionPane.showMessageDialog(
                                                          panel,
                                                          (value != null) ?
                                                          engine.getLocation() + "\n" + value.getMessage() :
                                                          engine.getLocation() + "\nUnexpected error.",
                                                          "Loading error...",
                                                          JOptionPane.ERROR_MESSAGE);
                                              }
                                          });
                                      }
                                  }
                              });

                      jfxPanel.setScene(new Scene(view));
                  }
              });
          }
       
          public void loadURL(final String url) {
              Platform.runLater(new Runnable() {
                  @Override
                  public void run() {
                      String tmp = toURL(url);
       
                      if (tmp == null) {
                          tmp = toURL("http://" + url);
                      }
       
                      engine.load(tmp);
                  }
              });
          }

          private static String toURL(String str) {
              try {
                  return new URL(str).toExternalForm();
              } catch (MalformedURLException exception) {
                      return null;
              }
          }

         

          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {

                  public void run() {
                      SimpleSwingBrowser browser = new SimpleSwingBrowser();
                      browser.setVisible(true);
                      browser.loadURL("http://oracle.com");
                 }
             });
          }
      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      not found yet

      FREQUENCY : always


        Attachments

          Activity

            People

            • Assignee:
              psadhukhan Prasanta Sadhukhan
              Reporter:
              webbuggrp Webbug Group
            • Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: