前言

其实自从学Java以来一直对Java开发桌面端的图形界面程序很感兴趣。
早些年自学的时候还开发过一些小游戏小工具等。
最近才发现JavaFX,有一种相见恨晚的感觉。
简单体验了一下JavaFX,就相当于一个增强版的Swing 、 Awt
开发起来要更方便,效率跟高。

跟着教程学了个入门, 就打算写点什么。
因为发现其内置了一个非常方便WebView,于是用了不到200行代码写一个简易的浏览器。

源码地址:
Github: https://github.com/18121259693/JavaFxBrowserDemo
Gitee: https://gitee.com/tczmh/JavaFxBrowserDemo



代码

目录结构

  1. ├── src
  2. └── com
  3. └── zzzmh
  4. ├── controller
  5. └── IndexController.java
  6. ├── view
  7. └── index.fxml
  8. └── Main.java

主要文件

IndexController.java 负责流程控制触发效果

  1. package com.zzzmh.controller;
  2. import javafx.beans.value.ChangeListener;
  3. import javafx.beans.value.ObservableValue;
  4. import javafx.concurrent.Worker;
  5. import javafx.scene.control.TextField;
  6. import javafx.scene.web.WebView;
  7. /**
  8. * @author zzzmh
  9. */
  10. public class IndexController {
  11. public TextField url;
  12. public WebView webview;
  13. public static String homePageUrl = "https://www.baidu.com";
  14. /**
  15. * 初始化
  16. */
  17. public void init() {
  18. // webview 加入监听器 状态改变后 自动把新的url回显到文本输入框
  19. webview.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
  20. @Override
  21. public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {
  22. url.setText(webview.getEngine().getLocation());
  23. }
  24. });
  25. // 跳转首页
  26. home();
  27. }
  28. /**
  29. * 后退
  30. */
  31. public void prev() {
  32. // 必须不是第一个页 才可以后退 否则会出现
  33. if (webview.getEngine().getHistory().getCurrentIndex() > 0) {
  34. webview.getEngine().getHistory().go(-1);
  35. }
  36. }
  37. /**
  38. * 前进
  39. */
  40. public void next() {
  41. // 前进必须前面还有页面
  42. if(webview.getEngine().getHistory().currentIndexProperty().getValue()
  43. < webview.getEngine().getHistory().getEntries().size() - 1){
  44. webview.getEngine().getHistory().go(1);
  45. }
  46. }
  47. /**
  48. * 刷新
  49. */
  50. public void refresh() {
  51. // 重新加载当前引擎
  52. webview.getEngine().reload();
  53. }
  54. /**
  55. * 首页
  56. */
  57. public void home() {
  58. // 跳转默认首页
  59. goTo(homePageUrl);
  60. }
  61. /**
  62. * 跳转
  63. */
  64. public void forward() {
  65. // 跳转到输入的url (本方法关联跳转按钮)
  66. goTo(url.getText().startsWith("http") ? url.getText() : "http://" + url.getText());
  67. }
  68. /**
  69. * 跳转的通用方法
  70. */
  71. public void goTo(String urlString) {
  72. webview.getEngine().load(urlString);
  73. }
  74. }

index.fxml 负责页面布局

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?import javafx.scene.control.*?>
  3. <?import javafx.scene.layout.*?>
  4. <?import javafx.scene.web.*?>
  5. <BorderPane prefHeight="-Infinity" prefWidth="-Infinity" xmlns="http://javafx.com/javafx/10.0.2-internal"
  6. xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zzzmh.controller.IndexController">
  7. <top>
  8. <!-- 工具栏 -->
  9. <ToolBar prefHeight="40.0" prefWidth="-Infinity" BorderPane.alignment="CENTER">
  10. <items>
  11. <!-- 按钮-->
  12. <Button mnemonicParsing="false" onAction="#prev" text="后退"/>
  13. <Button mnemonicParsing="false" onAction="#next" text="前进"/>
  14. <Button mnemonicParsing="false" onAction="#refresh" text="刷新"/>
  15. <Button mnemonicParsing="false" onAction="#home" text="首页"/>
  16. <!-- 标签 -->
  17. <Label text="地址"/>
  18. <!-- 地址栏 -->
  19. <TextField fx:id="url" prefWidth="980"/>
  20. <!-- 跳转按钮 -->
  21. <Button mnemonicParsing="false" onAction="#forward" text="跳转"/>
  22. </items>
  23. </ToolBar>
  24. </top>
  25. <center>
  26. <!-- WebView -->
  27. <WebView fx:id="webview" prefHeight="-Infinity" prefWidth="-Infinity" BorderPane.alignment="CENTER"/>
  28. </center>
  29. </BorderPane>

Main.java 程序的主入口,执行main方法启动整个程序

  1. package com.zzzmh;
  2. import com.zzzmh.controller.IndexController;
  3. import javafx.application.Application;
  4. import javafx.fxml.FXMLLoader;
  5. import javafx.scene.Parent;
  6. import javafx.scene.Scene;
  7. import javafx.stage.Stage;
  8. public class Main extends Application {
  9. @Override
  10. public void start(Stage primaryStage) throws Exception{
  11. // fxml加载器
  12. FXMLLoader fxmlLoader = new FXMLLoader();
  13. fxmlLoader.setLocation(getClass().getResource("view/index.fxml"));
  14. // fxml加载到 根节点
  15. Parent root = fxmlLoader.load();
  16. // 设置标题
  17. primaryStage.setTitle("极简牛腩器 (Simple Browser)");
  18. // 设置默认宽高 并加入根节点
  19. primaryStage.setScene(new Scene(root, 1280, 720));
  20. // 显示窗口
  21. primaryStage.show();
  22. // 获取IndexController
  23. IndexController controller = (IndexController)fxmlLoader.getController();
  24. // 执行IndexController中的初始化方法
  25. controller.init();
  26. }
  27. /**
  28. * 入口方法
  29. * 执行本方法启动整个程序
  30. */
  31. public static void main(String[] args) {
  32. launch(args);
  33. }
  34. }


结果

简单实现了一些浏览器基本功能






END