使用JavaFX制作一个简单的生日礼物

JavaFX版本:Java 8

最近小姐妹要过生日了,往年我们俩送礼基本上看缘分,今年忽然想到去年学了点JavaFX,不如整点有意思的东西送给她。

设计大致思路如下:做一个window弹出窗口,根据文字提示,她可以在对话框内输入随机数,点击确定后会从txt文档里读出一条心灵鸡汤显示,不过生成前三句不是心灵鸡汤,而是生日祝福。

窗口效果如下:

 (问她喜欢什么颜色,她说喜欢黑粉色……嗯)

项目结构见下图:

GiftView类代码:

package com.wzy;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Random;

public class GiftView  extends Application {

    private DoubleProperty WWidth;

    private DoubleProperty WHeight;

    private StringProperty text;

    private StringProperty label;

    private ArrayList<String> txt;

    @Override
    public void start(Stage primaryStage) {

        text = new SimpleStringProperty();
        label = new SimpleStringProperty();

        //读取data.txt文件
        txt = new ArrayList<>();
        InputStream path = this.getClass().getResourceAsStream("/data.txt");
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(path))) {
            String s = reader.readLine();
            while (s != null){
                txt.add(s);
                s = reader.readLine();
            }
        }catch (IOException e){
            label.setValue("文字读取异常!");
        }

        //窗口长宽
        WWidth = new SimpleDoubleProperty(600);
        WHeight = new SimpleDoubleProperty(300);

        //创建窗口背景
        Rectangle r1 = new Rectangle(0,0,WWidth.get(),WHeight.get());
        r1.setFill(Paint.valueOf("#272727"));

        //创建窗口头
        double headerHeight = 45;
        Rectangle r2 = new Rectangle(0,0,WWidth.get(),headerHeight);
        r2.setFill(Paint.valueOf("#FF0088"));

        //小蛋糕图标
        String cakeUrl = "picture/cake.png";
        double cakeSize = headerHeight-20;
        Image img1 = new Image(cakeUrl,cakeSize,cakeSize,true,true);
        ImageView cakeView = new ImageView(img1);

        //对话框标题
        String title = "生日礼物";
        Label titleView = new Label(title);
        Font fontTitle = new Font(18);
        titleView.setFont(fontTitle);

        //最小化图形
        String minUrl = "picture/min.png";
        double minSize = headerHeight-25;
        Image img2 = new Image(minUrl,minSize,minSize,true,true);
        ImageView minView = new ImageView(img2);
        Rectangle min = new Rectangle(0,0,headerHeight-25,headerHeight-25);
        min.setFill(Color.TRANSPARENT);
        min.setOnMouseClicked(event -> {
            primaryStage.setIconified(true);
        });
        StackPane minPane = new StackPane(minView,min);

        //关闭图形
        String closeUrl = "picture/close.png";
        double closeSize = headerHeight-25;
        Image img3 = new Image(closeUrl,minSize,closeSize,true,true);
        ImageView closeView = new ImageView(img3);
        Rectangle close = new Rectangle(0,0,headerHeight-25,headerHeight-25);
        close.setFill(Color.TRANSPARENT);
        close.setOnMouseClicked(event -> {
            Platform.exit();
        });
        StackPane closePane = new StackPane(closeView,close);


        ColumnConstraints c1 = new ColumnConstraints();
        c1.setHalignment(HPos.LEFT);
        ColumnConstraints c2 = new ColumnConstraints();
        c2.setHalignment(HPos.LEFT);
        ColumnConstraints c3 = new ColumnConstraints();
        c3.setHalignment(HPos.RIGHT);
        ColumnConstraints c4 = new ColumnConstraints();
        c4.setHalignment(HPos.RIGHT);

        GridPane g1 = new GridPane();
        g1.setPickOnBounds(false);
        g1.getColumnConstraints().addAll(c1,c2,c3,c4);

        g1.add(cakeView,0,0);
        g1.add(titleView,1,0);
        g1.add(minPane,2,0);
        g1.add(closePane,3,0);

        g1.setPadding(new Insets(10,10,5,10));
        g1.setHgap(10);

        GridPane.setHgrow(titleView,Priority.ALWAYS);

        StackPane s1 = new StackPane();
        s1.getChildren().addAll(r2,g1);


        //创建窗口内容
        Font fontContent = new Font(16);
        Label label1 = new Label("请输入随机数(范围:1~100)");
        label1.setFont(fontContent);
        label1.setTextFill(Color.web("#FF0088"));

        BorderPane b1 = new BorderPane(label1);

        TextField textField = new TextField();
        textField.setFont(fontContent);
        textField.setStyle("-fx-text-fill: #FF0088");
        textField.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT,null,null)));
        textField.setBorder(new Border(new BorderStroke(
                Paint.valueOf("#FF0088"),
                BorderStrokeStyle.SOLID,
                new CornerRadii(5),
                new BorderWidths(1))));
        textField.textProperty().bindBidirectional(text);

        Button button = new Button("确认");
        button.setStyle("-fx-background-radius: 3px 3px 3px 3px;-fx-background-color: #FF0088;");
        button.setMinHeight(35);
        button.setFont(fontContent);
        button.setOnAction( event -> {
            happyBirthday();
        });

        HBox hBox = new HBox(10);
        hBox.getChildren().addAll(textField,button);
        BorderPane b2 = new BorderPane(new Group(hBox));


        Label label2 = new Label();
        label2.setMaxWidth(500);
        label2.setFont(fontContent);
        label2.setTextFill(Color.web("#FF0088"));
        label2.textProperty().bindBidirectional(label);
        BorderPane b3 = new BorderPane(label2);

        GridPane g2 = new GridPane();
        g2.setVgap(20);
        g2.setPadding(new Insets(30,0,30,0));
        g2.add(b1,0,0);
        g2.add(b2,0,1);
        g2.add(b3,0,2);
        g2.setHgrow(b1,Priority.ALWAYS);
        g2.setHgrow(b2,Priority.ALWAYS);
        g2.setVgrow(b3,Priority.ALWAYS);

        //创建窗口边框
        Rectangle r3 = new Rectangle(0,0,WWidth.get()-2,WHeight.get()-2);
        r3.setFill(Color.TRANSPARENT);
        r3.setStroke(Paint.valueOf("#FFB7DD"));
        r3.setStrokeWidth(2);
        r3.setMouseTransparent(true);

        GridPane g3 = new GridPane();
        g3.add(s1,0,0);
        g3.add(g2,0,1);
        g3.setVgrow(g2,Priority.ALWAYS);

        StackPane stackPane = new StackPane();
        stackPane.getChildren().addAll(r1,g3,r3);

        Scene scene = new Scene(stackPane,600,300);

        primaryStage.setScene(scene);
        primaryStage.getIcons().add(img1);
        primaryStage.setTitle(title);
        primaryStage.initStyle(StageStyle.TRANSPARENT);

        primaryStage.show();
    }

    int counter = 1;

    private void happyBirthday() {
        label.setValue("");
        try {
            long num = Integer.parseInt(text.get());
            if (num>0 && num<100){
                if (counter == 1){
                    counter++;
                    label.setValue("亲爱的洋洋");
                    return;
                }else if (counter == 2){
                    counter++;
                    label.setValue("祝你生日快乐哦~");
                    return;
                }else if (counter == 3){
                    counter++;
                    label.setValue("🎉🎉🎉🎉🎉🎉🎉🎉");
                    return;
                }

                int max = txt.size();
                Random rand = new Random();
                int randNumber = rand.nextInt(max);

                StringBuffer stringBuffer = new StringBuffer(txt.get(randNumber));
                if (stringBuffer.length() > 30){
                    stringBuffer.insert(30,"\n");
                }

                if (stringBuffer.length() > 60){
                    stringBuffer.insert(60,"\n");
                }

                label.setValue(stringBuffer.toString());

            }else {
                label.setValue("数字超出范围啦~");
            }
        }catch (NumberFormatException e){
            label.setValue("输入的不是数字!");
        }
    }
}

 

最麻烦的应该是调UI样式了,该项目还用了三个png的图片,一个是图标的蛋糕,还有两个是最小化和关闭的图片,可以去免费的图片网站上搜索一下~

txt的内容是这样的,找了30多句心灵鸡汤:

 

到此项目就OK啦,关于打包参考了链接:

idea打包可执行的jar与Error: Invalid or corrupt jarfile问题_是小白哇的博客-CSDN博客

以及如何在没有安装过Java的电脑上运行jar包:

如何让别人不用装jdk环境也能运行你自己的jar包_微滑低的博客-CSDN博客_不用按照jdk环境直接运行jar

出现中文乱码问题需要使用以下命令:

java -Dfile.encoding=utf-8 -jar wzy-gift.jar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值