Не удалось обновить URL и обновить веб-просмотр - PullRequest
0 голосов
/ 24 апреля 2018

Это настройка моего проекта. Я пытаюсь обновить веб-просмотр, чтобы каждая вкладка обновлялась одной адресной строкой.Я не могу понять, где я иду не так.Я новичок в 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;
    }

1 Ответ

0 голосов
/ 25 апреля 2018

Если я правильно понял вопрос, у вас есть одно текстовое поле и несколько вкладок, каждая с браузером. Когда в текстовом поле происходит действие, вы хотите обновить местоположение браузера на текущей выбранной вкладке.

Самый простой способ - сохранить ссылку на текущий отображаемый браузер:

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 не должно быть статическим: удалить все вхождения ключевого слова static из класса Browser. После внесения этих изменений вы можете просто обновить текущий браузер:

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