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