【问题标题】:Not able to update url and update webview无法更新 url 和更新 webview
【发布时间】:2018-10-05 01:05:21
【问题描述】:

这是我正在尝试更新 web 视图的项目设置,因此每个选项卡都将由一个地址栏更新。我似乎无法找到我要去哪里错了。我是 javaFX 的新手。我知道我必须在其中为搜索按钮添加另一个更改侦听器,只是不确定如何...我找不到有关如何执行此操作的任何信息。除了一个没有真正解释任何东西并且代码很乱的例子。

public class Client extends Application {   
    private Scene scene;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    BorderPane root = new BorderPane();
    Browser browseR = new Browser();
    final TabPane tabs = new TabPane();
    final Tab home = new Tab("Home");
    final Tab newtab = new Tab("+");

    HBox hbox = new HBox();
    public static TextField addressBar = new TextField();
    final Group group = new Group(tabs,root,hbox); //joins the borderpane and browser element together

    @Override public void start(Stage stage) {

        // create the scene
        stage.setTitle("Web Browser");
        scene = new Scene(group,screenSize.getWidth(),screenSize.getHeight(), Color.web("#666970")); //create scene with root pane and browser pane

        hbox.setSpacing(10);
        hbox.setStyle("-fx-background-color: #FFFFFF;");
        hbox.setPadding(new Insets(5, 24, 5, 12));

        Button backButton = new Button("<");
        backButton.setOnAction(this::backButtonHandler);
        backButton.setPrefSize(25, 20);

        Button forwardButton = new Button(">");
        forwardButton.setOnAction(this::forwardButtonHandler);
        forwardButton.setPrefSize(25, 20);

        HBox.setHgrow(addressBar, Priority.ALWAYS);
        //addressBar.setMaxWidth(screenSize.getWidth()-200);

        Button searchButton = new Button("go");
        searchButton.setOnAction(this::searchButtonHandler);

        //add all menu elements to the top of the screen
        hbox.getChildren().addAll(backButton, forwardButton,addressBar,searchButton);

        setConstraints(tabs,hbox,stage);
        createHomeTab();   
        createNewTab();



        tabs.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {

            @Override
            public void changed(ObservableValue<? extends Tab> observable, Tab oldSelectedTab, Tab newSelectedTab) {
                if(newSelectedTab == newtab) {
                    final Tab tab = new Tab(browseR.getWebTitle());
                    tabs.getTabs().add(tab);
                    tabs.getSelectionModel().select(tab);
                    tab.setContent(new Browser());
                    loadFavicon(addressBar.getText(),tab);
                }
            }

            });

        root.setTop(hbox);
        root.setCenter(tabs);

        browseR.updateAddress();

        stage.setScene(scene);     
        stage.show();
    }

    public static void setConstraints(TabPane tabs, HBox hbox, Stage stage) {
        hbox.prefWidthProperty().bind(stage.widthProperty());
        tabs.prefHeightProperty().bind(stage.heightProperty());
    }

    private void backButtonHandler(ActionEvent event) {
        browseR.goBack();
    }
    public void createHomeTab() {
        tabs.getTabs().addAll(newtab,home);
        tabs.getSelectionModel().select(home);
        home.setContent(new Browser());
        loadFavicon(Browser.getHomePage(),home);
    }
    private void forwardButtonHandler(ActionEvent event) {
        browseR.goForward();
    }
    public void createNewTab() {
        newtab.setText(" + ");  
        newtab.setClosable(false);
    }
    private void searchButtonHandler(ActionEvent event) {
        Browser.navigate(addressBar.getText());
    }
    void loadFavicon(String location, Tab tab) {
      try {
        String faviconUrl = String.format("http://www.google.com/s2/favicons?domain_url=%s", URLEncoder.encode(location, "UTF-8"));
        Image favicon = new Image(faviconUrl, true);
        ImageView iv = new ImageView(favicon);
        tab.setGraphic(iv);
      } catch (UnsupportedEncodingException ex) {
          throw new RuntimeException(ex); // not expected
      }
    }
    public static void main(String[] args){
        //new Config();
        launch(args);
    }
}

public class Browser extends Region { 
    public static WebView browser = new WebView();
    public static WebEngine webEngine = getBrowser().getEngine();
    static String[] websites = {"http://www.google.com"};
    private static String homePage = websites[0];

    public Browser() {
        //apply the styles
        getStyleClass().add("browser");
        // load the web page
        webEngine.load(homePage);
        //add the web view to the scene
        getChildren().add(getBrowser());

    }

    public static void navigate(String website) {
        String google = "http://www.google.com/search?q=";
        String charset = "UTF-8";
        if(website.contains("http")) {
            webEngine.load(website);

            //debug
            System.out.println("found http");
        }
        else {
            try {
                webEngine.load(google+ URLEncoder.encode(website, charset));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }

        //debug
        System.out.println(website);
    }
    /*
    private Node createSpacer() {
        Region spacer = new Region();
        HBox.setHgrow(spacer, Priority.ALWAYS);
        return spacer;
    }
     */     
    public String getWebTitle() {
        return webEngine.getTitle();
    }
    public void goBack() {
         Platform.runLater(() -> {
                webEngine.executeScript("history.back()");
            });
    }
    public String updateAddress() {
        webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
             if (Worker.State.SUCCEEDED.equals(newValue)) {
                 Client.addressBar.setText(webEngine.getLocation());
             }
         });
        return null;
    }
    public void goForward() {
     Platform.runLater(() -> {
                webEngine.executeScript("history.forward()");
            });
   }
    @Override protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(getBrowser(),0,0,w,h,0, HPos.CENTER, VPos.CENTER);
    }

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

    @Override protected double computePrefHeight(double width) {
        return 500;
    }
    //getters and setters
    public static String getHomePage() {
        return homePage;
    }
    public static void setHomePage(String homePage) {
        Browser.homePage = homePage;
    }

    public static WebView getBrowser() {
        return browser;
    }

【问题讨论】:

  • 您似乎只创建了一个Browser。除非我理解错误,否则您不想在每个标签中使用不同的浏览器吗?
  • 是的,当调用公共无效更改时,我确实创建了一个新浏览器
  • 哦,是的:没看到它埋在那里。
  • 它控制标签内容或网络引擎一旦我创建它......我不知道引用该类是否是正确的方法。
  • 如果您希望在应用程序中显示多个 Web 视图,为什么要将 WebView 等设为静态?

标签: java eclipse javafx-8


【解决方案1】:

如果我对问题的理解正确,您有一个文本字段和多个选项卡,每个选项卡都有一个浏览器。当文本字段发生操作时,您希望更新浏览器在当前选定选项卡中的位置。

最简单的方法是保留对当前显示的浏览器的引用:

public class Client extends Application {   

    private Browser displayedBrowser ;

    // ...

}

当您创建新标签页和浏览器时,向标签页的 selectedProperty 添加一个侦听器,该侦听器会更新 displayedBrowser 字段:

tabs.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {

    @Override
    public void changed(ObservableValue<? extends Tab> observable, Tab oldSelectedTab, Tab newSelectedTab) {
        if(newSelectedTab == newtab) {
            final Tab tab = new Tab(browseR.getWebTitle());
            tabs.getTabs().add(tab);

            Browser newBrowser = new Browser();
            tab.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
                if (isNowSelected) {
                    displayedBrowser = newBrowser ;
                }
            });

            tabs.getSelectionModel().select(tab);

            tab.setContent(newBrowser);

            loadFavicon(addressBar.getText(),tab);
        }
    }

});

现在displayedBrowser 将始终指向当前选定选项卡中的浏览器。

显然,navigate 不能是静态方法,因为您想导航特定的浏览器:事实上,Browser 类中的 nothing 应该是静态的:删除 all em> 出现在 Browser 类中的 static 关键字。进行这些更改后,您只需更新当前浏览器即可:

private void searchButtonHandler(ActionEvent event) {
    displayedBrowser.navigate(addressBar.getText());
}

【讨论】:

  • 太棒了,谢谢!!!!这几天我一直在用头撞墙。对不起,我还在学习java,我还不懂行话,谢谢大家的帮助
  • 所以当我们创建一个新选项卡时,我们应该何时更新地址栏和选项卡名称上的信息。我一直在玩它,我没有看到更新,因为我正在更改 url 并移动标签
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2022-07-04
相关资源
最近更新 更多