一、窗体

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轮子的更多相关文章

  1. 基于JavaFX图形界面演示的迷宫创建与路径寻找

    事情的起因是收到了一位网友的请求,他的java课设需要设计实现迷宫相关的程序--如标题概括. 我这边不方便透露相关信息,就只把任务要求写出来. 演示视频指路: 视频过审后就更新链接 完整代码链接: 网 ...

  2. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  4. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  5. h5engine造轮子

    基于学习的造轮子,这是一个最简单,最基础的一个canvas渲染引擎,通过这个引擎架构,可以很快的学习canvas渲染模式! 地址:https://github.com/RichLiu1023/h5en ...

  6. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  7. 存在即合理,重复轮子orm java版本

    1,业务描述前序? 需求来源于,公司的运营部门.本人所在公司(私营,游戏行业公司),从初创业,我就进入公司,一直致力于服务器核心研发. 公司成立块3年了,前后出产了4款游戏,一直在重复的制造公司游戏对 ...

  8. 问题记录:JavaFx 鼠标滑轮滚动事件监听!

    问题描述: 在listview的item里面添加鼠标拖拽排序功能.代码如下: setOnMouseDragged(event -> { //设定鼠标长按0.3秒后才可拖拽 防止误操作 isCan ...

  9. JavaFx客户端服务器C/S架构搭建

    客户端获取服务器端软件更新版本方法: package com.platform.ui.update; import java.io.BufferedInputStream; import java.i ...

  10. Appium 三种wait方法(appium 学习之改造轮子)

    前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html   知乎Android客户端登陆:htt ...

随机推荐

  1. Web前端入门第 29 问:CSS 盒模型:网页布局的基石

    在 Web 网页开发中,盒模型(Box Model) 是 CSS 的核心概念,它决定了每个 HTML 元素在页面中占据的空间和布局方式. 无论是文本.图片还是按钮,浏览器都会将它们视为一个矩形盒子,并 ...

  2. Python+Selenium+unittest实例

    代码如下: # coding=utf-8 import time import unittest from selenium import webdriver class BaiduSearch(un ...

  3. 一文带你深度剖析什么叫Transformer

    Transformer概述 Transformer是基于自注意机制(self-attention)的神经网络模型.其经常用于来处理时序数据.我们知道还有另外的常用的两类深度神经网络模型循环神经网络(R ...

  4. Spring框架中的单例bean是线程安全的吗?

    1.介绍两个概念 有状态的bean:对象中有实例变量(成员变量),可以保存数据,是非线程安全的 无状态的bean:对象中没有实例变量(成员变量),不能保存数据,可以在多线程环境下共享,是线程安全的 2 ...

  5. spring_声明式事务: @Transactional

    例子. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww ...

  6. 即时通信SSE和WebSocket对比

    Server-Sent Events (SSE) 和 WebSocket 都是用于实现服务器与客户端实时通信的技术,但它们在设计目标.协议特性和适用场景上有显著区别.以下是两者的详细对比: 一.核心区 ...

  7. [设计模式/Java] 设计模式之门面模式(外观模式)【20】

    概述 : 门面模式 := 外观模式 := Facade Pattern 产生背景 软件开发过程中,我们经常会遇到复杂系统,其中包含多个子系统和接口.在这种情况下,为了简化客户端的调用过程,提高代码的可 ...

  8. 2025dsfzB层考试总结

    2025年东师附中B层春季测试1考试总结 Designed By Lwj54joy AT 2025-03-01 本文将遵守GNU GPL2.0开源协议. 概述 总分:\(310/400\) 改题分数: ...

  9. mysql免密登录

    开启mysql免密登录, vi /etc/my.cnf [mysqld]下添加 skip-grant-tables , 保存后重启mysql服务:service mysqld restart

  10. 使用 Python 接口编译和优化模型 (AutoTVM)

    在本节,将介绍与TVMC相同的知识,但展示的是如何使用Python API来完成它.完成本节后,我们将使用适用于 TVM 的 Python API 来完成以下任务: 为TVM Runtime编译预训练 ...