自用的JavaFx轮子
一、窗体
0.class的创建
入口,比如login等,用Java application创建。其他用普通class
需要被调用的面板初始化:例如创建主页面MainPane
//新建的类extends AnchorPane
//以下都在该类里
private static MainPane mainPane;
private Stage stage;
//上面的适用于给别的类直接调用
private MainPane(){
//基础配置。可能用try catch包起来
}
public Stage getStage(){
return this.stage;
}
public static void showMainPane(String name){
mainPane = new MainPane(name);
mainPane.getStage().show();
}//别的类要开面板就静态调用这个方法就行
0.5 可能需要的入口类。导出javafx application好像需要
新建一个类
public class StartApp {
public static void main(String[] args) {
Login.main(args);//login是打算的入口
}
}
1.基础配置
//设置fxml
FXMLLoader fx = new FXMLLoader();
AnchorPane root = (AnchorPane)fx.load(getClass().getClassLoader().getResource("login.fxml"));、
//fxml拖到src下。
//设置scene
Scene scene = new Scene(root);
scene.setFill(null);//透明
stage.setScene(scene);
//窗体设置
stage.initStyle(StageStyle.TRANSPARENT);//透明
stage.setTitle("登录");
2.窗口拖拽
//坐标
private double oldStageX;
private double oldStageY;
private double oldScreenX;
private double oldScreenY;
//窗口拖拽
Pane dragPane = new Pane();
dragPane.setLayoutX(-1.0);
dragPane.setOpacity(0.0);
dragPane.setPrefHeight(41.0);
dragPane.setPrefWidth(236.0);
root.getChildren().add(dragPane);
dragPane.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
oldStageX = stage.getX();
oldStageY = stage.getY();
oldScreenX = event.getScreenX();
oldScreenY = event.getScreenY();
}
});
dragPane.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
//新位置
//拖拽前后的鼠标差值加上原始窗体坐标值
stage.setX(event.getScreenX() - oldScreenX + oldStageX);
stage.setY(event.getScreenY() - oldScreenY + oldStageY);
}
});
3.关闭、最小化、最大化
//关闭按钮
Circle btn_close = new Circle();
btn_close.setLayoutX(25.0);
btn_close.setLayoutY(21.0);
btn_close.setRadius(7.0);
btn_close.setFill(Paint.valueOf("#ff481f"));
btn_close.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.close();
}
});
root.getChildren().add(btn_close);
//最小化按钮
Circle btn_minimize = new Circle();
btn_minimize.setLayoutX(45.0);
btn_minimize.setLayoutY(21.0);
btn_minimize.setRadius(7.0);
btn_minimize.setFill(Paint.valueOf("orange"));
btn_minimize.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.setIconified(true);
}
});
root.getChildren().add(btn_minimize);
最大化同理。
二、防止线程阻塞 好东西!
这是个好东西 多次救我 比如按回车后即使clear也会回车的问题。
Task<Void> recieveServertask = new Task<Void>() {
@Override public Void call() {
//···
Platform.runLater(() -> {
//在runlater里开防止连接时页面被阻塞
});
return null;
}
};
new Thread(recieveServertask).start();
三、导出exe 烦
1.建议用jdk1.8(java 8)。再新就导不出exe了。Oracle真的太过分啦!(
2.


png 转 ico http://pic.55.la/png2ico/
不要忘记
1.stage.show();
2.层次顺序,先创建的再下。
3.如果是较新的java,每个ui类都要配置vmoption
普通页面创建模板 直接改就行
package com.liuzhiwen.view.UIClass.server;
import com.liuzhiwen.controller.MainController;
import com.liuzhiwen.controller.client.ChatClient;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.io.IOException;
public class ServerPane extends AnchorPane {
private static ServerPane serverPane;
private Stage stage;
//坐标
private double oldStageX;
private double oldStageY;
private double oldScreenX;
private double oldScreenY;
private ServerPane(){
try {
//设置fxml
FXMLLoader fx = new FXMLLoader();
AnchorPane root = (AnchorPane) fx.load(getClass().getClassLoader().getResource("serverpane.fxml"));
stage = new Stage();
//设置scene
Scene scene = new Scene(root);
scene.setFill(null);//透明
stage.setScene(scene);
//窗体设置
stage.initStyle(StageStyle.TRANSPARENT);//透明
stage.setTitle("往生堂聊天室");
stage.getIcons().add(new Image("com/liuzhiwen/img/logo.png"));
// 窗口拖拽
Pane dragPane = new Pane();
dragPane.setLayoutX(-1.0);
dragPane.setOpacity(0.0);
dragPane.setPrefHeight(41.0);
dragPane.setPrefWidth(1040.0);
root.getChildren().add(dragPane);
dragPane.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
oldStageX = stage.getX();
oldStageY = stage.getY();
oldScreenX = event.getScreenX();
oldScreenY = event.getScreenY();
}
});
dragPane.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
//新位置
//拖拽前后的鼠标差值加上原始窗体坐标值
stage.setX(event.getScreenX() - oldScreenX + oldStageX);
stage.setY(event.getScreenY() - oldScreenY + oldStageY);
}
});
//关闭按钮
Circle btn_close = new Circle();
btn_close.setLayoutX(25.0);
btn_close.setLayoutY(21.0);
btn_close.setRadius(7.0);
btn_close.setFill(Paint.valueOf("#ff481f"));
btn_close.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.close();
}
});
root.getChildren().add(btn_close);
//最小化按钮
Circle btn_minimize = new Circle();
btn_minimize.setLayoutX(45.0);
btn_minimize.setLayoutY(21.0);
btn_minimize.setRadius(7.0);
btn_minimize.setFill(Paint.valueOf("orange"));
btn_minimize.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.setIconified(true);
}
});
root.getChildren().add(btn_minimize);
//logo
Image img_logo_main = new Image("com/liuzhiwen/img/logo_main.png",135,231,true,true);
ImageView iv_logo_main = new ImageView(img_logo_main);
iv_logo_main.setLayoutX(0);
iv_logo_main.setLayoutY(399);
root.getChildren().add(iv_logo_main);
} catch (IOException e) {
e.printStackTrace();
}
}
public Stage getStage(){
return this.stage;
}
public static void showServerPane(){
serverPane = new ServerPane();
serverPane.getStage().show();
}
}
自用的JavaFx轮子的更多相关文章
- 基于JavaFX图形界面演示的迷宫创建与路径寻找
事情的起因是收到了一位网友的请求,他的java课设需要设计实现迷宫相关的程序--如标题概括. 我这边不方便透露相关信息,就只把任务要求写出来. 演示视频指路: 视频过审后就更新链接 完整代码链接: 网 ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- h5engine造轮子
基于学习的造轮子,这是一个最简单,最基础的一个canvas渲染引擎,通过这个引擎架构,可以很快的学习canvas渲染模式! 地址:https://github.com/RichLiu1023/h5en ...
- 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...
- 存在即合理,重复轮子orm java版本
1,业务描述前序? 需求来源于,公司的运营部门.本人所在公司(私营,游戏行业公司),从初创业,我就进入公司,一直致力于服务器核心研发. 公司成立块3年了,前后出产了4款游戏,一直在重复的制造公司游戏对 ...
- 问题记录:JavaFx 鼠标滑轮滚动事件监听!
问题描述: 在listview的item里面添加鼠标拖拽排序功能.代码如下: setOnMouseDragged(event -> { //设定鼠标长按0.3秒后才可拖拽 防止误操作 isCan ...
- JavaFx客户端服务器C/S架构搭建
客户端获取服务器端软件更新版本方法: package com.platform.ui.update; import java.io.BufferedInputStream; import java.i ...
- Appium 三种wait方法(appium 学习之改造轮子)
前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html 知乎Android客户端登陆:htt ...
随机推荐
- Web前端入门第 29 问:CSS 盒模型:网页布局的基石
在 Web 网页开发中,盒模型(Box Model) 是 CSS 的核心概念,它决定了每个 HTML 元素在页面中占据的空间和布局方式. 无论是文本.图片还是按钮,浏览器都会将它们视为一个矩形盒子,并 ...
- Python+Selenium+unittest实例
代码如下: # coding=utf-8 import time import unittest from selenium import webdriver class BaiduSearch(un ...
- 一文带你深度剖析什么叫Transformer
Transformer概述 Transformer是基于自注意机制(self-attention)的神经网络模型.其经常用于来处理时序数据.我们知道还有另外的常用的两类深度神经网络模型循环神经网络(R ...
- Spring框架中的单例bean是线程安全的吗?
1.介绍两个概念 有状态的bean:对象中有实例变量(成员变量),可以保存数据,是非线程安全的 无状态的bean:对象中没有实例变量(成员变量),不能保存数据,可以在多线程环境下共享,是线程安全的 2 ...
- spring_声明式事务: @Transactional
例子. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww ...
- 即时通信SSE和WebSocket对比
Server-Sent Events (SSE) 和 WebSocket 都是用于实现服务器与客户端实时通信的技术,但它们在设计目标.协议特性和适用场景上有显著区别.以下是两者的详细对比: 一.核心区 ...
- [设计模式/Java] 设计模式之门面模式(外观模式)【20】
概述 : 门面模式 := 外观模式 := Facade Pattern 产生背景 软件开发过程中,我们经常会遇到复杂系统,其中包含多个子系统和接口.在这种情况下,为了简化客户端的调用过程,提高代码的可 ...
- 2025dsfzB层考试总结
2025年东师附中B层春季测试1考试总结 Designed By Lwj54joy AT 2025-03-01 本文将遵守GNU GPL2.0开源协议. 概述 总分:\(310/400\) 改题分数: ...
- mysql免密登录
开启mysql免密登录, vi /etc/my.cnf [mysqld]下添加 skip-grant-tables , 保存后重启mysql服务:service mysqld restart
- 使用 Python 接口编译和优化模型 (AutoTVM)
在本节,将介绍与TVMC相同的知识,但展示的是如何使用Python API来完成它.完成本节后,我们将使用适用于 TVM 的 Python API 来完成以下任务: 为TVM Runtime编译预训练 ...