Browser 如何制作一个前进按钮来浏览JavaFx浏览器,以及一个可以打开包含所有超链接的列表的按钮?

Browser 如何制作一个前进按钮来浏览JavaFx浏览器,以及一个可以打开包含所有超链接的列表的按钮?,browser,javafx,Browser,Javafx,现在,我已经使用JavaFx完成了一个简单的web浏览器。我成功地做了一个后退按钮……但我没有成功地做一个前进按钮。另外,我想到了一个按钮,它将打开一个列表,其中包含在JavaFx浏览器中访问过的所有超链接(或链接)。我怎样才能使后退按钮工作?用一个按钮打开一个窗口,显示上次访问的页面的HiperLink(或链接),怎么样?(我想到了一个DefaultListModel和一个ArrayList,但我不想听听你的意见)。提前感谢!:) 这是我的密码: backButton.setOnAct

现在,我已经使用JavaFx完成了一个简单的web浏览器。我成功地做了一个后退按钮……但我没有成功地做一个前进按钮。另外,我想到了一个按钮,它将打开一个列表,其中包含在JavaFx浏览器中访问过的所有超链接(或链接)。我怎样才能使后退按钮工作?用一个按钮打开一个窗口,显示上次访问的页面的HiperLink(或链接),怎么样?(我想到了一个DefaultListModel和一个ArrayList,但我不想听听你的意见)。提前感谢!:)

这是我的密码:

    backButton.setOnAction(new EventHandler<javafx.event.ActionEvent>() {
        public void handle(javafx.event.ActionEvent event) {

            int sizeHistory = webEngine.getHistory().getEntries().size();
      if(sizeHistory>1)       {


          Entry entry = webEngine.getHistory().getEntries().get(sizeHistory-2); 

         webEngine.load(entry.getUrl());
        }
        }
    });

     forwardButton.setOnAction(new EventHandler<javafx.event.ActionEvent>() {
        public void handle(javafx.event.ActionEvent event) {

            int sizeHistory = webEngine.getHistory().getEntries().size();
      if(sizeHistory>1)       {


          Entry entry = webEngine.getHistory().getEntries().get(sizeHistory);
          System.out.println("URL hist.: " + entry.getUrl());
         webEngine.load(entry.getUrl());
        }
        }
    });
             }
backButton.setOnAction(新的EventHandler(){
公共无效句柄(javafx.event.ActionEvent){
int-sizeHistory=webEngine.getHistory().getEntries().size();
如果(大小历史>1){
Entry Entry=webEngine.getHistory().getEntries().get(sizeHistory-2);
load(entry.getUrl());
}
}
});
setOnAction(新的EventHandler(){
公共无效句柄(javafx.event.ActionEvent){
int-sizeHistory=webEngine.getHistory().getEntries().size();
如果(大小历史>1){
Entry Entry=webEngine.getHistory().getEntries().get(sizeHistory);
System.out.println(“URL hist:”+entry.getUrl());
load(entry.getUrl());
}
}
});
}

我不太懂你的后退和前进按钮。您计算为
sizeHistory
的值只是访问(并存储在历史记录中)的总页数。当然,操纵者应该

backButton.setOnAction(e -> webEngine.getHistory().go(-1));
forwardButton.setOnAction(e -> webEngine.getHistory().go(1));
对于问题的另一部分,您可以创建一个
列表视图
,其中显示历史记录中的条目:

ListView<WebHistory.Entry> historyView = new ListView<>();
historyView.setItems(history.getEntries());
SSCCE:

import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.concurrent.Worker.State;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.web.WebHistory;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebBrowser extends Application {

    private TextField textField ;
    private WebView webView ;

    @Override
    public void start(Stage primaryStage) {
        webView = new WebView();

        webView.getEngine().getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == State.SUCCEEDED) {
                primaryStage.setTitle(webView.getEngine().getTitle());
                textField.setText(webView.getEngine().getLocation());
            }
        });

        textField = new TextField("http://stackoverflow.com/questions/32802248/");
        textField.setOnAction(e -> load());

        load();

        Button clearButton = new Button("Clear");
        clearButton.setOnAction(e -> webView.getEngine().loadContent(""));

        WebHistory history = webView.getEngine().getHistory() ;

        Button backButton =  new Button("Back");
        backButton.disableProperty().bind(history.currentIndexProperty().lessThanOrEqualTo(0));
        backButton.setOnAction(e -> 
                history.go(-1));

        Button forwardButton = new Button("Forward");
        forwardButton.disableProperty().bind(
                history.currentIndexProperty().greaterThanOrEqualTo(Bindings.size(history.getEntries()).subtract(1)));
        forwardButton.setOnAction(e -> 
                history.go(1));

        HBox controls = new HBox(10, textField, backButton, clearButton, forwardButton);
        HBox.setHgrow(textField, Priority.ALWAYS);
        controls.setPadding(new Insets(10));

        ListView<WebHistory.Entry> historyView = new ListView<>();
        historyView.setItems(history.getEntries());
        historyView.setCellFactory(lv -> new ListCell<WebHistory.Entry>() {
            @Override
            public void updateItem(WebHistory.Entry entry, boolean empty) {
                super.updateItem(entry, empty);
                textProperty().unbind();
                if (empty) {
                    setText(null);
                } else {
                    textProperty().bind(entry.titleProperty());
                }
            }
        });

        history.currentIndexProperty().addListener((obs, oldIndex, newIndex) -> {
            if (newIndex.intValue() != historyView.getSelectionModel().getSelectedIndex()) {
                historyView.getSelectionModel().clearAndSelect(newIndex.intValue());
            }
        });

        historyView.getSelectionModel().selectedIndexProperty().addListener((obs, oldValue, newValue) -> {
            if (newValue.intValue() != history.getCurrentIndex()) {
                history.go(newValue.intValue() - history.getCurrentIndex());
            }
        });

        BorderPane root = new BorderPane(webView, controls, historyView, null, null);

        textField.setPadding(new Insets(5));
        root.setPadding(new Insets(5));
        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    private void load() {
        String url = makeUrl(textField.getText()) ;
        webView.getEngine().load(url);
        textField.setText(url);
    }


    private String makeUrl(String text) {
        if (Pattern.matches("[a-zA-Z]+:.+", text)) {
            return text ;
        } else return "http://"+text ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
import java.util.regex.Pattern;
导入javafx.application.application;
导入javafx.beans.binding.Bindings;
导入javafx.concurrent.Worker.State;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.ListCell;
导入javafx.scene.control.ListView;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.Priority;
导入javafx.scene.web.WebHistory;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
公共类WebBrowser扩展应用程序{
私有文本字段文本字段;
私有网络视图;
@凌驾
公共无效开始(阶段primaryStage){
webView=新建webView();
webView.getEngine().getLoadWorker().stateProperty().addListener((obs、oldState、newState)->{
if(newState==State.successed){
setTitle(webView.getEngine().getTitle());
textField.setText(webView.getEngine().getLocation());
}
});
textField=新的textField(“http://stackoverflow.com/questions/32802248/");
setOnAction(e->load());
加载();
按钮清除按钮=新按钮(“清除”);
clearButton.setOnAction(e->webView.getEngine().loadContent(“”);
WebHistory history=webView.getEngine().getHistory();
按钮后退按钮=新按钮(“后退”);
backButton.disableProperty().bind(history.currentIndexProperty().lessThanOrEqualTo(0));
backButton.setOnAction(e->
历史。go(-1));
按钮前进按钮=新按钮(“前进”);
forwardButton.disableProperty().bind(
history.currentIndexProperty().greaterThanOrEqualTo(Bindings.size(history.getEntries()).subtract(1));
forwardButton.setOnAction(e->
历史。go(1));
HBox控件=新的HBox(10,文本字段,后退按钮,清除按钮,前进按钮);
HBox.setHgrow(textField,Priority.ALWAYS);
控件。设置填充(新插图(10));
ListView historyView=新建ListView();
setItems(history.getEntries());
setCellFactory(lv->new ListCell()){
@凌驾
public void updateItem(WebHistory.Entry,布尔值为空){
super.updateItem(条目,空);
textProperty().unbind();
if(空){
setText(空);
}否则{
textProperty().bind(entry.titleProperty());
}
}
});
history.currentIndexProperty().addListener((obs、oldIndex、newIndex)->{
if(newIndex.intValue()!=historyView.getSelectionModel().getSelectedIndex()){
historyView.getSelectionModel().clearAndSelect(newIndex.intValue());
}
});
historyView.getSelectionModel().selectedIndexProperty().addListener((obs、oldValue、newValue)->{
if(newValue.intValue()!=history.getCurrentIndex()){
go(newValue.intValue()-history.getCurrentIndex());
}
});
BorderPane root=新的BorderPane(webView、控件、historyView、null、null);
设置填充(新插图(5));
根。设置填充(新插图(5));
场景=新场景(根,800600);
初级阶段。场景(场景);
primaryStage.show();
}
专用空心荷载(){
字符串url=makeUrl(textField.getText());
webView.getEngine().load(url);
textField.setText(url);
}
私有字符串makeUrl(字符串文本){
if(Pattern.matches(“[a-zA-Z]+:.+”,text)){
返回文本;
}否则返回“http://”+文本;
}
公共静态void main(字符串[]args){
发射(args);
}
}

效果很好!谢谢
history.currentIndexProperty().addListener((obs, oldIndex, newIndex) -> {
    if (newIndex.intValue() != historyView.getSelectionModel().getSelectedIndex()) {
        historyView.getSelectionModel().clearAndSelect(newIndex.intValue());
    }
});

historyView.getSelectionModel().selectedIndexProperty().addListener((obs, oldValue, newValue) -> {
    if (newValue.intValue() != history.getCurrentIndex()) {
        history.go(newValue.intValue() - history.getCurrentIndex());
    }
});
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.concurrent.Worker.State;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.web.WebHistory;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebBrowser extends Application {

    private TextField textField ;
    private WebView webView ;

    @Override
    public void start(Stage primaryStage) {
        webView = new WebView();

        webView.getEngine().getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == State.SUCCEEDED) {
                primaryStage.setTitle(webView.getEngine().getTitle());
                textField.setText(webView.getEngine().getLocation());
            }
        });

        textField = new TextField("http://stackoverflow.com/questions/32802248/");
        textField.setOnAction(e -> load());

        load();

        Button clearButton = new Button("Clear");
        clearButton.setOnAction(e -> webView.getEngine().loadContent(""));

        WebHistory history = webView.getEngine().getHistory() ;

        Button backButton =  new Button("Back");
        backButton.disableProperty().bind(history.currentIndexProperty().lessThanOrEqualTo(0));
        backButton.setOnAction(e -> 
                history.go(-1));

        Button forwardButton = new Button("Forward");
        forwardButton.disableProperty().bind(
                history.currentIndexProperty().greaterThanOrEqualTo(Bindings.size(history.getEntries()).subtract(1)));
        forwardButton.setOnAction(e -> 
                history.go(1));

        HBox controls = new HBox(10, textField, backButton, clearButton, forwardButton);
        HBox.setHgrow(textField, Priority.ALWAYS);
        controls.setPadding(new Insets(10));

        ListView<WebHistory.Entry> historyView = new ListView<>();
        historyView.setItems(history.getEntries());
        historyView.setCellFactory(lv -> new ListCell<WebHistory.Entry>() {
            @Override
            public void updateItem(WebHistory.Entry entry, boolean empty) {
                super.updateItem(entry, empty);
                textProperty().unbind();
                if (empty) {
                    setText(null);
                } else {
                    textProperty().bind(entry.titleProperty());
                }
            }
        });

        history.currentIndexProperty().addListener((obs, oldIndex, newIndex) -> {
            if (newIndex.intValue() != historyView.getSelectionModel().getSelectedIndex()) {
                historyView.getSelectionModel().clearAndSelect(newIndex.intValue());
            }
        });

        historyView.getSelectionModel().selectedIndexProperty().addListener((obs, oldValue, newValue) -> {
            if (newValue.intValue() != history.getCurrentIndex()) {
                history.go(newValue.intValue() - history.getCurrentIndex());
            }
        });

        BorderPane root = new BorderPane(webView, controls, historyView, null, null);

        textField.setPadding(new Insets(5));
        root.setPadding(new Insets(5));
        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    private void load() {
        String url = makeUrl(textField.getText()) ;
        webView.getEngine().load(url);
        textField.setText(url);
    }


    private String makeUrl(String text) {
        if (Pattern.matches("[a-zA-Z]+:.+", text)) {
            return text ;
        } else return "http://"+text ;
    }

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