Javafx实现浏览器

        浏览器是一种计算机程序,主要用于显示互联网上的网页。通过浏览器,用户可以访问各种网站、搜索引擎、在线应用程序、社交媒体等。常见的浏览器包括Google Chrome、Mozilla Firefox、Safari、Microsoft Edge、Opera等。浏览器的功能不仅限于浏览网页,还包括下载文件、管理书签、保存密码、清除浏览数据等。浏览器已成为人们日常生活中必不可少的工具之一。

        下面我们使用JavaFx来实现一下浏览器,代码如下:


import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.*;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebHistory;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class BrowserApplication extends Application {private static String URL = "https://www.fmill.cn/";private String url = URL;private String content;private Stage stage;private WebEngine engine;private TextField urlField;public BrowserApplication() {}public BrowserApplication(String url) {this.url = url;URL = url;}public BrowserApplication setAutoRefresh() {return this;}@Overridepublic void start(Stage primaryStage) {stage = primaryStage;AnchorPane root = new AnchorPane();
//HBox topBox = new HBox();topBox.setPrefHeight(30);topBox.setPrefWidth(1000);
//        topBox.setStyle("-fx-border-color: #999");int len = 60;urlField = new TextField();urlField.setPrefWidth(916 - len);urlField.setPrefHeight(30);setSearchTextFieldStyle(urlField);Image iconImage = JavaFxUtils.getIconImage();Label homeLabel = newLabel(JavaFxUtils.getHomeImage());Label backLabel = newLabel(JavaFxUtils.getPrevImage());Label nextLabel = newLabel(JavaFxUtils.getNextImage());Label freshLabel = newLabel(JavaFxUtils.getFreshImage());Label moreLabel = newLabel(JavaFxUtils.getMoreImage());topBox.getChildren().addAll(backLabel, nextLabel, freshLabel, homeLabel, urlField, moreLabel);WebView browser = new WebView();browser.setPrefWidth(1000);browser.setPrefHeight(800);AnchorPane.setTopAnchor(browser, 30.0);//获取web浏览器引擎内核对象engine = browser.getEngine();engine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {System.out.println(oldValue + "->" + newValue);reload();if (newValue == Worker.State.SUCCEEDED) {System.out.println("finished loading");}});urlField.setText(this.url);urlField.setOnAction(e -> {href(urlField.getText());});
//        urlField.textProperty().bind(engine.locationProperty());System.out.println("是否开启脚本:" + engine.isJavaScriptEnabled());engine.userAgentProperty().addListener(((observable, oldValue, newValue) -> {System.out.println("userAgent:" + oldValue + "," + newValue);}));if (content != null) {engine.loadContent(content);} else {href(url);}engine.locationProperty().addListener((event, o, n) -> {System.out.println(o + "->" + n);});root.getChildren().addAll(topBox, browser);primaryStage.setTitle("小筱浏览器");stage.getIcons().add(iconImage);Scene scene = new Scene(root);primaryStage.setScene(scene);primaryStage.setWidth(1020);primaryStage.setHeight(850);primaryStage.show();primaryStage.widthProperty().addListener((event, o, n) -> {if (n != null) {browser.setPrefWidth(n.doubleValue() - 20);topBox.setPrefWidth(n.doubleValue() - 10);urlField.setPrefWidth(n.doubleValue() - 110 - len);}});primaryStage.heightProperty().addListener((event, o, n) -> {browser.setPrefHeight(n.doubleValue() - 50);});homeLabel.setOnMouseClicked(event -> {System.out.println("首页");href("https://www.fmill.cn");});backLabel.setOnMouseClicked(event -> {WebHistory history = engine.getHistory();if (history.getCurrentIndex() > 0) {history.go(-1);}});nextLabel.setOnMouseClicked(event -> {WebHistory history = engine.getHistory();if (history.getCurrentIndex() < history.getEntries().size() - 1) {history.go(+1);}});freshLabel.setOnMouseClicked(event -> {String location = engine.getLocation();href(location);});root.setOnKeyPressed(event -> {if (event.getCode().equals(KeyCode.F5)) {System.out.println("刷新页面");engine.reload();String location = engine.getLocation();System.out.println(location);this.url = location;URL = this.url;}});engine.onStatusChangedProperty().addListener((event, o, n) -> {System.out.println("onStatusChangedProperty");});primaryStage.setOnCloseRequest(event -> {primaryStage.close();});}private void href(String openUrl) {engine.load(openUrl);this.url = openUrl;URL = this.url;this.urlField.setText(openUrl);}private void reload() {String location = engine.getLocation();WebHistory history = engine.getHistory();System.out.println(history.getCurrentIndex());if (!this.url.equals(location)) {System.out.println("网址发生改变...");this.url = location;URL = this.url;this.urlField.setText(location);} else {System.out.println("网址未发生变动");}}private static Label newLabel(Image image) {Label label = new Label();label.setBackground(getBackground(image));label.setPrefWidth(30);label.setPrefHeight(30);label.setMinWidth(30);label.setMinHeight(30);return label;}public static Background getBackground(Image image) {return new Background(new BackgroundImage(image, BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER, BackgroundSize.DEFAULT));}private void setSearchTextFieldStyle(TextField urlField) {urlField.setStyle("-fx-border-color: #e2e2e2;-fx-background-color: #e2e2e2;-fx-border-radius: 10px;-fx-background-radius: 10px;-fx-highlight-fill: #a4adc7;-fx-highlight-text-fill: #000000;");urlField.setOnMousePressed(event ->urlField.setStyle("-fx-border-color: #29aff8;-fx-background-color: #fff;-fx-border-radius: 10px;-fx-highlight-fill: #a4adc7;-fx-highlight-text-fill: #000000;"));urlField.setOnMouseExited(event ->urlField.setStyle("-fx-border-color: #ced0d5;-fx-background-color: #fff;-fx-border-radius: 10px;-fx-highlight-fill: #a4adc7;-fx-highlight-text-fill: #000000;"));}public void setUrl(String url) {this.url = url;URL = this.url;}public BrowserApplication setContent(String content) {this.content = content;return this;}
}

        其中获取Image这里需要自己定义:

        图标在下面,有需要的话自己抓取:

        输入百度链接,效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell编程

1、开发内存监测脚本 功能描述 监测linux剩余可用的内存&#xff0c;当可用内存小于100M时&#xff0c;就发邮件给我&#xff1b;并且将该脚本加入crontab&#xff0c;每3分钟检查一次内存知识点 获取当前内存的命令&#xff1a;free -m # 以兆的形式显示代码 #! /bin/bashf…

15、pytest的fixture调用fixture

官方实例 # content of test_append.py import pytest# Arrange pytest.fixture def first_entry():return "a"# Arrange pytest.fixture def order(first_entry):return [first_entry]def test_string(order):# Actorder.append("b")# Assertassert orde…

Python中检查字符串是否仅包含字母的多种方法:深入探究

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 随着Python在数据处理和字符串操作方面的广泛应用&#xff0c;经常需要对字符串进行验证&#xff0c;确认其是否仅包含字母。本文将探讨Python中的多种方法来检查字符串是否只由字母组成&#xff0c;以及它们的应…

自助POS收银机-亿发互联网收银解决方案助力零售业迎接数字经济挑战

零售业作为中国经济的主动脉&#xff0c;扮演着至关重要的角色。最新发布的《中国线下零售小店数字化转型报告》揭示了当前线下零售小店所面临的多重痛点&#xff0c;经营方式传统、滞后的内部管理和营销模式&#xff0c;以及缺乏消费数据等问题&#xff0c;这些痛点都指明&…

项目经理是干出来的,不是教出来的

大家好&#xff0c;我是老原。 有不少新手项目经理&#xff0c;在通过了PMP认证考试&#xff0c;拿到PMP证书后&#xff0c;对之前无序的项目管理状态感觉有了一丝通透的感觉&#xff0c;对接受新项目更是信心满满。 然后就有不少没有项目管理经验&#xff0c;且刚刚考取PMP证…

玩转大数据7:数据湖与数据仓库的比较与选择

1. 引言 在当今数字化的世界中&#xff0c;数据被视为一种宝贵的资源&#xff0c;而数据湖和数据仓库则是两种重要的数据处理工具。本文将详细介绍这两种工具的概念、作用以及它们之间的区别和联系。 1.1. 数据湖的概念和作用 数据湖是一个集中式存储和处理大量数据的平台&a…

Vue Computed

小满&#xff0c;我的神&#xff01; 视频链接 // 只读 const plusOne computed(() > count.value 1) // 可读可写 const plusOne computed({get: () > count.value 1,set: (val) > {count.value val - 1} }, { // 用于调试onTrack(e) {debugger},onTrigger(e) …

网上选课系统源码(Java)

JavaWebjsp网上选课系统源码 运行示意图&#xff1a;

GD32F103*固件库移植FreeRTOS详细教程与解析

GD32F103*固件库移植FreeRTOS详细教程与解析 GD32F103*移植μCOS-Ⅲ详细教程与解析&#xff0c;欢迎指正 文章目录 GD32F103*固件库移植FreeRTOS详细教程与解析前言一、移植前的准备二、移植步骤1.文件结构2.添加代码3.编译与配置 三、注意事项总结 前言 FreeRTOS是一个可以基…

Hadoop学习笔记(HDP)-Part.09 安装OpenLDAP

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

网工内推 | 上市公司初级网工,HCIP认证优先,14薪,享企业年金

01 易佰网络 招聘岗位&#xff1a;初级网络工程师 职责描述&#xff1a; 1.电脑周边设备&#xff08;打印机、扫描仪、传真机、复印机、投影仪等&#xff09;安装与维护&#xff1b; 2.局域网维护&#xff1b;无线网WLAN维护&#xff1b;监控系统维护&#xff1b; 3.固资维护管…

学校图书管理系统的开发

目 录 摘要 1 Abstract. 1 1 引言 2 1.1 图书管理的现状 2 1.2 现有图书管理系统的概述 3 1.3 选题的目的、意义 3 1.4 图书管理系统的可行性分析 4 1.5 系统开发运行环境 4 2 图书管理系统开发相关技术的介绍 5 2.1 Asp.net的介绍 5 2.1.1 Asp.net的优势介绍 5 2.1.2 Asp.net…

记录一下Mac配置SpringBoot开发环境

由于很多项目喜欢使用传统的 Java 8 进行开发&#xff0c;而且 Java 8 的稳定性也是经过长久考验的&#xff0c;我们接下来就尝试一下&#xff0c;在一台新的 Mac 中配置 Java 环境&#xff0c;并且开始创建 SpringBoot 项目。 首先&#xff0c;去 Oracle 官网下载 java8 JDK …

玩转数据8:数据质量管理与数据清洗的实践

引言 在当今数字化时代&#xff0c;数据质量管理和数据清洗对于企业和组织来说变得至关重要。随着大数据的快速增长和数据驱动决策的普及&#xff0c;确保数据的准确性、一致性和完整性成为保证业务成功的关键因素。本文将探讨数据质量管理和数据清洗的概念、目标以及其在Java…

Servlet作业1

1.【单选题】 (10分) &#xff08;B &#xff09;是一个用 Java 编写的程序&#xff0c;是一种实现了Servlet接口的类&#xff0c;它是由web容器负责创建并调用&#xff0c;在服务器容器上运行&#xff0c;用于接收和响应用户的请求。 A.Filter B.Servlet C.Request D.Res…

药敏分析分子对接

RCSB PDB: Homepage AutoDock Vina (scripps.edu) GSCA - Gene Set Cancer Analysis (hust.edu.cn) 药物筛选 gscalite数据库&#xff08;好像用不了了&#xff09; PRISM CTRP CMap GDSC oncoPredict文献学习-CSDN博客 蛋白的3D结构 RCSB PDB: Homepage SH3PXD2B G…

CRC(循环冗余校验)直接计算和查表法

文章目录 CRC概述CRC名词解释宽度 (WIDTH)多项式 &#xff08;POLY&#xff09;初始值 &#xff08;INIT&#xff09;结果异或值 &#xff08;XOROUT&#xff09;输入数据反转&#xff08;REFIN&#xff09;输出数据反转&#xff08;REFOUT&#xff09; CRC手算过程模二加减&am…

vue3中手写一个日历,年部分,月部分,周部分,日部分

效果图 高度自定义&#xff0c;支持每天的统计展示&#xff0c;弹窗展示&#xff0c;详情操作 月部分&#xff1a; 默认展示当前月&#xff0c;支持前进和后退选择下一月 支持自定义每月的展示数据&#xff0c; 周部分&#xff1a; 分为上下午&#xff0c;可以列出要做的事项…

30、pytest入门内容回顾

整体结构 解读与实操 pytest30讲主要从四个方面由浅入深的进行解读&#xff0c; 开始 讲解了pytest的概述&#xff0c;安装前的准备工作&#xff08;python,pycharm,pytest&#xff09;&#xff0c;运行方式&#xff08;命令行&#xff09;&#xff0c;断言&#xff08;assert…

麒麟linux将图片批量生成PDF的方法

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 问题描述&#xff1a; wind…