2013-05-04 24 views
1

我想創建一個web瀏覽器的javafx webview的幫助。 我正在使用下面的代碼來創建Web瀏覽器。它給出了錯誤異常,而運行程序webview沒有運行使用像web瀏覽器

package webviewbrowser; 

    import com.sun.javaws.Main; 
    import javafx.application.Application; 
    import javafx.application.Platform; 
    import javafx.beans.value.ChangeListener; 
    import javafx.beans.value.ObservableValue; 
    import javafx.collections.ListChangeListener; 
    import javafx.collections.ListChangeListener.Change; 
    import javafx.concurrent.Worker.State; 
    import javafx.event.ActionEvent; 
    import javafx.event.Event; 
    import javafx.event.EventHandler; 
    import javafx.geometry.HPos; 
    import javafx.geometry.Pos; 
    import javafx.geometry.VPos; 
    import javafx.scene.Node; 
    import javafx.scene.Scene; 
    import javafx.scene.control.Button; 
    import javafx.scene.control.ComboBox; 
    import javafx.scene.control.Hyperlink; 
    import javafx.scene.image.Image; 

    import javafx.scene.image.ImageView; 
    import javafx.scene.layout.HBox; 
    import javafx.scene.layout.Priority; 
    import javafx.scene.layout.Region; 
    import javafx.scene.paint.Color; 
    import javafx.scene.web.PopupFeatures; 
    import javafx.scene.web.WebEngine; 
    import javafx.scene.web.WebHistory; 
    import javafx.scene.web.WebHistory.Entry; 
    import javafx.scene.web.WebView; 
    import javafx.stage.Stage; 
    import javafx.util.Callback; 
    import netscape.javascript.JSObject; 

    public class WebViewBrowser extends Application { 

     private Scene scene; 

     @Override 
     public void start(Stage stage) { 
     // create scene 
     stage.setTitle("Web View"); 
     scene = new Scene(new Browser(), 750, 500, Color.web("#666970")); 
     stage.setScene(scene); 
     // apply CSS style 
     scene.getStylesheets().add("webviewsample/BrowserToolbar.css"); 
     // show stage 
     stage.show(); 
     } 

     public static void main(String[] args) { 
     launch(args); 
     } 
    } 

    class Browser extends Region { 

    private HBox toolBar; 
     private static String[] imageFiles = new String[]{ 
     "product.png", 
     "blog.png", 
     "forum.png", 
     "partners.png", 
     "help.png" 
     }; 
     private static String[] captions = new String[]{ 
     "Products", 
     "Blogs", 
     "Forums", 
     "Partners", 
     "Help" 
     }; 
    private static String[] urls = new String[]{ 
     "http://www.oracle.com/products/index.html", 
     "http://blogs.oracle.com/", 
     "http://forums.oracle.com/forums/", 
     "http://www.oracle.com/partners/index.html", 
     Main.class.getResource("help.html").toExternalForm() 
     }; 
    final ImageView selectedImage = new ImageView(); 
    final Hyperlink[] hpls = new Hyperlink[captions.length]; 
    final Image[] images = new Image[imageFiles.length]; 
    final WebView browser = new WebView(); 
    final WebEngine webEngine = browser.getEngine(); 
    final Button hideAll = new Button("Hide All"); 
    final Button showAll = new Button("ShowAll"); 
    final WebView smallView = new WebView(); 
    final ComboBox comboBox = new ComboBox(); 
    private boolean needForumButtons = false; 

     public Browser() { 
     //apply the styles 
     getStyleClass().add("browser"); 

     for (int i = 0; i < captions.length; i++) { 
      // create hyperlinks 
      Hyperlink hpl = hpls[i] = new Hyperlink(captions[i]); 
      Image image = images[i] = 
        new Image(getClass().getResourceAsStream(imageFiles[i])); 
      hpl.setGraphic(new ImageView(image)); 
      final String url = urls[i]; 
      final boolean addButtons = (hpl.getText().equals("Forums")); 

      // process event 
      hpl.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent e) { 
        needForumButtons = addButtons; 
        webEngine.load(url); 
       } 
      }); 
     } 

     comboBox.setPrefWidth(60); 

     // create the toolbar 
     toolBar = new HBox(); 
     toolBar.setAlignment(Pos.CENTER); 
     toolBar.getStyleClass().add("browser-toolbar"); 
     toolBar.getChildren().add(comboBox); 
     toolBar.getChildren().addAll(hpls); 
     toolBar.getChildren().add(createSpacer()); 

     //set actions for the buttons 
     hideAll.setOnAction(new EventHandler() { 
      @Override 
      public void handle(Event t) { 
       webEngine.executeScript("hideAll()"); 
      } 
     }); 

     showAll.setOnAction(new EventHandler() { 
      @Override 
      public void handle(Event t) { 
       webEngine.executeScript("showAll()"); 
      } 
     }); 

     smallView.setPrefSize(120, 80); 

     //handle popup windows 
     webEngine.setCreatePopupHandler(
      new Callback<PopupFeatures, WebEngine>() { 
       @Override public WebEngine call(PopupFeatures config) { 
        smallView.setFontScale(0.8); 
        if (!toolBar.getChildren().contains(smallView)) { 
         toolBar.getChildren().add(smallView); 
        } 
        return smallView.getEngine(); 
       } 
      } 
     ); 

     //process history 
     final WebHistory history = webEngine.getHistory(); 
     history.getEntries().addListener(new 
      ListChangeListener<WebHistory.Entry>(){ 
       @Override 
       public void onChanged(Change<? extends Entry> c) { 
        c.next(); 
        for (Entry e : c.getRemoved()) { 
         comboBox.getItems().remove(e.getUrl()); 
        } 
        for (Entry e : c.getAddedSubList()) { 
         comboBox.getItems().add(e.getUrl()); 
        } 
       } 
     }); 

     //set the behavior for the history combobox    
     comboBox.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent ev) { 
       int offset = 
         comboBox.getSelectionModel().getSelectedIndex() 
         - history.getCurrentIndex(); 
       history.go(offset); 
      } 
     }); 



     // process page loading 
     webEngine.getLoadWorker().stateProperty().addListener(
      new ChangeListener<State>() { 
       @Override 
       public void changed(ObservableValue<? extends State> ov, 
        State oldState, State newState) { 
        toolBar.getChildren().removeAll(showAll, hideAll);  
        if (newState == State.SUCCEEDED) { 
          JSObject win = 
           (JSObject) webEngine.executeScript("window"); 
          win.setMember("app", new JavaApp()); 
          if (needForumButtons) { 
           toolBar.getChildren().addAll(showAll, hideAll); 
          } 
         } 
        } 
       } 
     ); 

     // load the home page   
     webEngine.load("http://www.oracle.com/products/index.html"); 

     //add components 
     getChildren().add(toolBar); 
     getChildren().add(browser); 
    } 

    // JavaScript interface object 
    public class JavaApp { 

     public void exit() { 
      Platform.exit(); 
     } 
    } 

    private Node createSpacer() { 
     Region spacer = new Region(); 
     HBox.setHgrow(spacer, Priority.ALWAYS); 
     return spacer; 
    } 

    @Override 
    protected void layoutChildren() { 
     double w = getWidth(); 
     double h = getHeight(); 
     double tbHeight = toolBar.prefHeight(w); 
     layoutInArea(browser,0,0,w,h-tbHeight,0,HPos.CENTER,VPos.CENTER); 
     layoutInArea(toolBar,0,h-tbHeight,w,tbHeight,0,HPos.CENTER,VPos.CENTER); 
    } 

    @Override 
    protected double computePrefWidth(double height) { 
     return 750; 
    } 

    @Override 
    protected double computePrefHeight(double width) { 
     return 600; 
    } 
} 

回答

0

爲我工作。

該代碼只是引用了一些本地html,css和圖像資源,這些資源未包含在您的問題中。因爲他們不在那裏,如果你只是複製並粘貼並運行,那麼由於缺少資源文件,你會得到NullPointerExceptions。


對於任何人想知道,在大多數問題的代碼來自於,它是Oracle的 Adding HTML Content to JavaFX Applications的一部分。可以從代碼鏈接下載代碼並允許其運行而無需修改的額外資源(html,css等),以及可以加載運行該程序的NetBeans項目。


我註釋了對外部資源的引用,以便程序可以獨立運行。這不是所有與圖像很好風格等,但它似乎爲我工作得很好。

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.ListChangeListener; 
import javafx.concurrent.Worker.State; 
import javafx.event.ActionEvent; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.geometry.HPos; 
import javafx.geometry.Pos; 
import javafx.geometry.VPos; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.Hyperlink; 
import javafx.scene.image.Image; 

import javafx.scene.image.ImageView; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.Region; 
import javafx.scene.paint.Color; 
import javafx.scene.web.PopupFeatures; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebHistory; 
import javafx.scene.web.WebHistory.Entry; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 
import javafx.util.Callback; 
import netscape.javascript.JSObject; 

public class WebViewBrowser extends Application { 

    private Scene scene; 

    @Override 
    public void start(Stage stage) { 
    // create scene 
    stage.setTitle("Web View"); 
    scene = new Scene(new Browser(), 750, 500, Color.web("#666970")); 
    stage.setScene(scene); 
    // apply CSS style 
// scene.getStylesheets().add("webviewsample/BrowserToolbar.css"); 
    // show stage 
    stage.show(); 
    } 

    public static void main(String[] args) { 
    launch(args); 
    } 
} 

class Browser extends Region { 

    private HBox toolBar; 
    private static String[] imageFiles = new String[]{ 
     "product.png", 
     "blog.png", 
     "forum.png", 
     "partners.png", 
     "help.png" 
    }; 
    private static String[] captions = new String[]{ 
     "Products", 
     "Blogs", 
     "Forums", 
     "Partners" 
//  "Help" 
    }; 
    private static String[] urls = new String[]{ 
     "http://www.oracle.com/products/index.html", 
     "http://blogs.oracle.com/", 
     "http://forums.oracle.com/forums/", 
     "http://www.oracle.com/partners/index.html" 
//  Main.class.getResource("help.html").toExternalForm() 
    }; 
    final ImageView selectedImage = new ImageView(); 
    final Hyperlink[] hpls = new Hyperlink[captions.length]; 
    final Image[] images = new Image[imageFiles.length]; 
    final WebView browser = new WebView(); 
    final WebEngine webEngine = browser.getEngine(); 
    final Button hideAll = new Button("Hide All"); 
    final Button showAll = new Button("ShowAll"); 
    final WebView smallView = new WebView(); 
    final ComboBox comboBox = new ComboBox(); 
    private boolean needForumButtons = false; 

    public Browser() { 
    //apply the styles 
    getStyleClass().add("browser"); 

    for (int i = 0; i < captions.length; i++) { 
     // create hyperlinks 
     Hyperlink hpl = hpls[i] = new Hyperlink(captions[i]); 
//  Image image = images[i] = 
//   new Image(getClass().getResourceAsStream(imageFiles[i])); 
//  hpl.setGraphic(new ImageView(image)); 
     final String url = urls[i]; 
     final boolean addButtons = (hpl.getText().equals("Forums")); 

     // process event 
     hpl.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent e) { 
      needForumButtons = addButtons; 
      webEngine.load(url); 
     } 
     }); 
    } 

    comboBox.setPrefWidth(60); 

    // create the toolbar 
    toolBar = new HBox(); 
    toolBar.setAlignment(Pos.CENTER); 
    toolBar.getStyleClass().add("browser-toolbar"); 
    toolBar.getChildren().add(comboBox); 
    toolBar.getChildren().addAll(hpls); 
    toolBar.getChildren().add(createSpacer()); 

    //set actions for the buttons 
    hideAll.setOnAction(new EventHandler() { 
     @Override 
     public void handle(Event t) { 
     webEngine.executeScript("hideAll()"); 
     } 
    }); 

    showAll.setOnAction(new EventHandler() { 
     @Override 
     public void handle(Event t) { 
     webEngine.executeScript("showAll()"); 
     } 
    }); 

    smallView.setPrefSize(120, 80); 

    //handle popup windows 
    webEngine.setCreatePopupHandler(
     new Callback<PopupFeatures, WebEngine>() { 
      @Override public WebEngine call(PopupFeatures config) { 
      smallView.setFontScale(0.8); 
      if (!toolBar.getChildren().contains(smallView)) { 
       toolBar.getChildren().add(smallView); 
      } 
      return smallView.getEngine(); 
      } 
     } 
    ); 

    //process history 
    final WebHistory history = webEngine.getHistory(); 
    history.getEntries().addListener(new 
             ListChangeListener<WebHistory.Entry>(){ 
              @Override 
              public void onChanged(Change<? extends Entry> c) { 
              c.next(); 
              for (Entry e : c.getRemoved()) { 
               comboBox.getItems().remove(e.getUrl()); 
              } 
              for (Entry e : c.getAddedSubList()) { 
               comboBox.getItems().add(e.getUrl()); 
              } 
              } 
             }); 

    //set the behavior for the history combobox 
    comboBox.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent ev) { 
     int offset = 
      comboBox.getSelectionModel().getSelectedIndex() 
       - history.getCurrentIndex(); 
     history.go(offset); 
     } 
    }); 



    // process page loading 
    webEngine.getLoadWorker().stateProperty().addListener(
     new ChangeListener<State>() { 
      @Override 
      public void changed(ObservableValue<? extends State> ov, 
           State oldState, State newState) { 
      toolBar.getChildren().removeAll(showAll, hideAll); 
      if (newState == State.SUCCEEDED) { 
       JSObject win = 
        (JSObject) webEngine.executeScript("window"); 
       win.setMember("app", new JavaApp()); 
       if (needForumButtons) { 
       toolBar.getChildren().addAll(showAll, hideAll); 
       } 
      } 
      } 
     } 
    ); 

    // load the home page 
    webEngine.load("http://www.oracle.com/products/index.html"); 

    //add components 
    getChildren().add(toolBar); 
    getChildren().add(browser); 
    } 

    // JavaScript interface object 
    public class JavaApp { 

    public void exit() { 
     Platform.exit(); 
    } 
    } 

    private Node createSpacer() { 
    Region spacer = new Region(); 
    HBox.setHgrow(spacer, Priority.ALWAYS); 
    return spacer; 
    } 

    @Override 
    protected void layoutChildren() { 
    double w = getWidth(); 
    double h = getHeight(); 
    double tbHeight = toolBar.prefHeight(w); 
    layoutInArea(browser,0,0,w,h-tbHeight,0,HPos.CENTER,VPos.CENTER); 
    layoutInArea(toolBar,0,h-tbHeight,w,tbHeight,0,HPos.CENTER,VPos.CENTER); 
    } 

    @Override 
    protected double computePrefWidth(double height) { 
    return 750; 
    } 

    @Override 
    protected double computePrefHeight(double width) { 
    return 600; 
    } 
} 

半晌回我創建了一個WebView Web Browser。你可以看看這個來獲得你的網頁瀏覽器的靈感。瀏覽器中的代碼需要進行一些清理和更改,以利用WebView的一些更現代的內置功能,例如WebView的內置歷史列表,但它是一個非常實用的選項卡式瀏覽器,您可能仍會找到它有用。

+0

從哪裏我可以得到額外的資源 – 2013-05-04 09:44:37

+0

從[WebView教程頁面]右側的「其他文件」部分(http://docs.oracle.com/javafx/2/webview/jfxpub -webview.htm)我在我的答案中鏈接。 – jewelsea 2013-05-04 16:25:28