美文网首页
用Java自己写一个浏览器 —— JavaFX 入门

用Java自己写一个浏览器 —— JavaFX 入门

作者: zzzmh | 来源:发表于2020-01-10 10:17 被阅读0次


前言

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

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

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

代码

目录结构

├── src
    └── com
        └── zzzmh
            ├── controller
            │   └── IndexController.java
            ├── view
            │   └── index.fxml
            └── Main.java

主要文件

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

package com.zzzmh.controller;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.scene.control.TextField;
import javafx.scene.web.WebView;

/**
 * @author zzzmh
 */
public class IndexController {

    public TextField url;
    public WebView webview;
    public static String homePageUrl = "https://www.baidu.com";


    /**
     * 初始化
     */
    public void init() {
        // webview 加入监听器 状态改变后 自动把新的url回显到文本输入框
        webview.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
            @Override
            public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {
                url.setText(webview.getEngine().getLocation());
            }
        });
        // 跳转首页
        home();
    }

    /**
     * 后退
     */
    public void prev() {
        // 必须不是第一个页 才可以后退 否则会出现
        if (webview.getEngine().getHistory().getCurrentIndex() > 0) {
            webview.getEngine().getHistory().go(-1);
        }
    }

    /**
     * 前进
     */
    public void next() {
        // 前进必须前面还有页面
        if(webview.getEngine().getHistory().currentIndexProperty().getValue()
                < webview.getEngine().getHistory().getEntries().size() - 1){
            webview.getEngine().getHistory().go(1);
        }
    }

    /**
     * 刷新
     */
    public void refresh() {
        // 重新加载当前引擎
        webview.getEngine().reload();
    }

    /**
     * 首页
     */
    public void home() {
        // 跳转默认首页
        goTo(homePageUrl);
    }


    /**
     * 跳转
     */
    public void forward() {
        // 跳转到输入的url (本方法关联跳转按钮)
        goTo(url.getText().startsWith("http") ? url.getText() : "http://" + url.getText());
    }

    /**
     * 跳转的通用方法
     */
    public void goTo(String urlString) {
        webview.getEngine().load(urlString);
    }

}

index.fxml 负责页面布局

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.web.*?>

<BorderPane prefHeight="-Infinity" prefWidth="-Infinity" xmlns="http://javafx.com/javafx/10.0.2-internal"
            xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zzzmh.controller.IndexController">
    <top>
        <!-- 工具栏 -->
        <ToolBar prefHeight="40.0" prefWidth="-Infinity" BorderPane.alignment="CENTER">
            <items>
                <!-- 按钮-->
                <Button mnemonicParsing="false" onAction="#prev" text="后退"/>
                <Button mnemonicParsing="false" onAction="#next" text="前进"/>
                <Button mnemonicParsing="false" onAction="#refresh" text="刷新"/>
                <Button mnemonicParsing="false" onAction="#home" text="首页"/>
                <!-- 标签 -->
                <Label text="地址"/>
                <!-- 地址栏 -->
                <TextField fx:id="url" prefWidth="980"/>
                <!-- 跳转按钮 -->
                <Button mnemonicParsing="false" onAction="#forward" text="跳转"/>
            </items>
        </ToolBar>
    </top>
    <center>
        <!-- WebView -->
        <WebView fx:id="webview" prefHeight="-Infinity" prefWidth="-Infinity" BorderPane.alignment="CENTER"/>
    </center>
</BorderPane>

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

package com.zzzmh;

import com.zzzmh.controller.IndexController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        // fxml加载器
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("view/index.fxml"));
        // fxml加载到 根节点
        Parent root = fxmlLoader.load();
        // 设置标题
        primaryStage.setTitle("极简牛腩器 (Simple Browser)");
        // 设置默认宽高 并加入根节点
        primaryStage.setScene(new Scene(root, 1280, 720));
        // 显示窗口
        primaryStage.show();
        // 获取IndexController
        IndexController controller = (IndexController)fxmlLoader.getController();
        // 执行IndexController中的初始化方法
        controller.init();
    }

    /**
     * 入口方法
     * 执行本方法启动整个程序
     */
    public static void main(String[] args) {
        launch(args);
    }
}

结果

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

百度 bilibili v2ex

END

本文也将同步发表在我的博客和笔记站,欢迎访问
https://zzzmh.cn
https://leanote.zzzmh.cn

相关文章

网友评论

      本文标题:用Java自己写一个浏览器 —— JavaFX 入门

      本文链接:https://www.haomeiwen.com/subject/ttdpactx.html