自用的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();

    }

}
posted @   Fordson  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示