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