Get user input from textfield to load website of their choice

180 Views Asked by At

I'm making a web browser using JavaFX and currently running into an issue. The function that have to allow the user to visit any site they want doesn't work. What I tried to do is use the getText() method to obtain the url that the use entered in the textfield, then it will use webEngine.load() and add http:// before the input. Afterwards it will be put inside parethesis of WebEngine.load to load the website of the user's choice.

However this does not work. What I have tried to get to the root of the problem is I made a button just for the function to go to a specific site. That worked perfectly. I have also tried to create a new webView setup just so I can get the browser to essentially "start fresh" but with the website that the user entered. But that didn't work either.

This is my code for reference:

package application;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebHistory;
import javafx.scene.web.WebView;

public class Main extends Application {
    private BorderPane root;
    private WebView webView;
    private WebEngine webEngine;
    private HBox addressBar;
    private HBox statusBar;
    private Text domain;
    private WebHistory history;
    
    private final String homePage = "https://google.ca";
    
    private void setupAddressBar() {
        addressBar = new HBox();
        Button home = new Button("Home");
        Button back = new Button("<--");
        Button forward = new Button("-->");
        Button refresh = new Button("Refresh");
        
        Button load = new Button("Load");
        
        TextField url = new TextField();
        addressBar.getChildren().addAll(home,back,forward,refresh,url, load);
        
        class HomeButton implements EventHandler<ActionEvent>{
            @Override
            public void handle(ActionEvent e) {
                homePage();
            }
        }
        
        class BackButton implements EventHandler<ActionEvent>{
            @Override
            public void handle(ActionEvent e) {
                back();
            }
        }
        
        class ForwardButton implements EventHandler<ActionEvent>{
            @Override
            public void handle(ActionEvent e) {
                forward();
            }
        }
        
        class RefreshButton implements EventHandler<ActionEvent>{
            @Override
            public void handle(ActionEvent e) {
                refreshPage();
            }
        }
        
        class DomainBar implements EventHandler<ActionEvent>{
            @Override
            public void handle(ActionEvent e) {
                loadPage();
            }
        }
        
        class LoadPage implements EventHandler<ActionEvent>{
            @Override
            public void handle(ActionEvent e) {
                loadPage();
            }
        }
        
        /*
         class KeyboardPressedHandler implements EventHandler<KeyEvent>{
                @Override
                public void handle(KeyEvent event) {
                    KeyCode key = event.getCode();
                    
                    if(key == KeyCode.ENTER ) {
                        loadPage();
                    }
                }
            };
        */  

        HomeButton homeButton = new HomeButton();
        home.setOnAction(homeButton);
        
        BackButton backButton = new BackButton();
        back.setOnAction(backButton);
        
        ForwardButton forwardButton = new ForwardButton();
        forward.setOnAction(forwardButton);
        
        RefreshButton refreshButton = new RefreshButton();
        refresh.setOnAction(refreshButton);
        
        DomainBar domainBar =  new DomainBar();
        url.setOnAction(domainBar);
        
        LoadPage loadPage = new LoadPage();
        load.setOnAction(loadPage);
    }
        
    private void setupStatusBar() {
        statusBar = new HBox();
            domain = new Text("google.ca");
            Text separator = new Text("|");
            Text copyright = new Text("JavaFX -- All Rights Reserved.");
            
            statusBar.getChildren().addAll(domain, separator, copyright);
    }
    
    public void setupWebView() {
        webView = new WebView();
        webEngine = webView.getEngine();
        webEngine.load(homePage);
    }
    
    public void initialize(URL arg0, ResourceBundle arg1) {
        webEngine = webView.getEngine();
        loadPage();
    }
    
    public void loadPage() {
        webEngine.load("http://" + domain.getText());
    }
    
    public void homePage() {
        webEngine.load("http://google.ca");
    }
    
    public void refreshPage() {
        webEngine.reload();
    }
    
    public void forward() {
        history = webEngine.getHistory();
        ObservableList<WebHistory.Entry> entries = history.getEntries();
        history.go(1);
        domain.setText(entries.get(history.getCurrentIndex()).getUrl());
    }
    
    public void back() {
        history = webEngine.getHistory();
        ObservableList<WebHistory.Entry> entries = history.getEntries();
        history.go(-1);
        domain.setText(entries.get(history.getCurrentIndex()).getUrl());
    }
    
    public void start(Stage stage) {
        root = new BorderPane();

        this.setupAddressBar();
        this.setupWebView();
        this.setupStatusBar();

        root.setTop(addressBar);
        root.setBottom(statusBar);
        root.setCenter(webView);
        
        Scene scene = new Scene(root);
        stage.setScene(scene);
        //stage.getFullScreen(true);
        stage.setWidth(1200);
        stage.setHeight(1000);
        stage.setResizable(false);
        stage.setTitle("JavaFX Browser");
        stage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
1

There are 1 best solutions below

0
julien.giband On BEST ANSWER

The only problem here is that you're using the value of you're Text domain node instead of the one from TextField url, that you should declare as a field of your class.

It looks puzzling because you don't show any signal informing you that the page is being loaded or has an error. Putting a few logs here and there and using a debugger would help a lot.

Also, just a side remark: waiting for you Stage to be shown before loading your home page makes more sense and might keep you out of some trouble.

Here's a barely edited version that works:

package com.ahpcservices.test.SoWebview;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebHistory;
import javafx.scene.web.WebView;

public class Main extends Application {
  private BorderPane root;
  private WebView webView;
  private WebEngine webEngine;
  private HBox addressBar;
  private HBox statusBar;
  private Text domain;
  private TextField url;
  private WebHistory history;

  private final String homePage = "https://google.ca";

  // ------------------------------------------------------

  private void setupAddressBar() {
    addressBar = new HBox();
    Button home = new Button("Home");
    Button back = new Button("<--");
    Button forward = new Button("-->");
    Button refresh = new Button("Refresh");

    Button load = new Button("Load");

    url = new TextField();
    addressBar.getChildren().addAll(home, back, forward, refresh, url, load);

    class HomeButton implements EventHandler<ActionEvent> {

      @Override
      public void handle(ActionEvent e) {
        homePage();

      }
    }

    class BackButton implements EventHandler<ActionEvent> {

      @Override
      public void handle(ActionEvent e) {

        back();

      }
    }

    class ForwardButton implements EventHandler<ActionEvent> {

      @Override
      public void handle(ActionEvent e) {

        forward();

      }
    }

    class RefreshButton implements EventHandler<ActionEvent> {

      @Override
      public void handle(ActionEvent e) {

        refreshPage();
      }
    }

    class DomainBar implements EventHandler<ActionEvent> {

      @Override
      public void handle(ActionEvent e) {
        loadPage();
      }
    }

    class LoadPage implements EventHandler<ActionEvent> {

      @Override
      public void handle(ActionEvent e) {
        loadPage();
      }
    }

    /*
     * class KeyboardPressedHandler implements EventHandler<KeyEvent>{
     * 
     * @Override public void handle(KeyEvent event) {
     * 
     * KeyCode key = event.getCode();
     * 
     * if(key == KeyCode.ENTER ) { loadPage();
     * 
     * } } };
     */

    HomeButton homeButton = new HomeButton();
    home.setOnAction(homeButton);

    BackButton backButton = new BackButton();
    back.setOnAction(backButton);

    ForwardButton forwardButton = new ForwardButton();
    forward.setOnAction(forwardButton);

    RefreshButton refreshButton = new RefreshButton();
    refresh.setOnAction(refreshButton);

    DomainBar domainBar = new DomainBar();
    url.setOnAction(domainBar);

    LoadPage loadPage = new LoadPage();
    load.setOnAction(loadPage);

  }

  // ----------------------------------------------------
  private void setupStatusBar() {
    statusBar = new HBox();
    domain = new Text("google.ca");
    Text separator = new Text("|");
    Text copyright = new Text("JavaFX -- All Rights Reserved.");

    statusBar.getChildren().addAll(domain, separator, copyright);

  }

  // -------------------------------------------------
  public void setupWebView() {
    webView = new WebView();
    webEngine = webView.getEngine();
  }

  public void initialize(URL arg0, ResourceBundle arg1) {
    webEngine = webView.getEngine();
    loadPage();

  }

  public void loadPage() {

    webEngine.load("http://" + url.getText());
  }

  public void homePage() {
    webEngine.load("http://google.ca");
  }

  public void refreshPage() {
    webEngine.reload();
  }

  public void forward() {
    history = webEngine.getHistory();
    ObservableList<WebHistory.Entry> entries = history.getEntries();
    history.go(1);
    domain.setText(entries.get(history.getCurrentIndex()).getUrl());
  }

  public void back() {
    history = webEngine.getHistory();
    ObservableList<WebHistory.Entry> entries = history.getEntries();
    history.go(-1);
    domain.setText(entries.get(history.getCurrentIndex()).getUrl());
  }

  public void start(Stage stage) {
    root = new BorderPane();
    // ---------------------------------
    this.setupAddressBar();
    this.setupWebView();
    this.setupStatusBar();
    // ----------------------------------
    root.setTop(addressBar);
    root.setBottom(statusBar);
    root.setCenter(webView);

    // ----------------------------------

    Scene scene = new Scene(root);
    stage.setScene(scene);
    // stage.getFullScreen(true);
    stage.setWidth(1200);
    stage.setHeight(1000);
    stage.setResizable(false);
    stage.setTitle("JavaFX Browser");
    stage.setOnShown(e -> {
      webEngine.load(homePage);
    });
    stage.show();
    ;
  }

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