下载地址:www.wenshushu.vip/download.ph…
- 项目采用Maven构建,包含完整的JavaFX界面和图像处理功能
- 支持中国主流银行模板,可自定义账号、余额和日期信息4
- 图像处理使用Java2D API实现文本渲染,生成逼真截图3
- 提供FXML界面描述文件和CSS样式支持,易于扩展
- 包含完整的项目文档和构建说明,支持JAR共享分发
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bank.balance</groupId>
<artifactId>balance-generator</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17.0.2</version>
</dependency>
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-core</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.bank.balance.MainApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
package com.bank.balance;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class MainApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/fxml/main.fxml"));
primaryStage.setTitle("银行余额生成器 v1.0");
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.setResizable(false);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
package com.bank.balance.controller;
import javafx.embed.swing.SwingFXUtils;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainController {
@FXML private ComboBox<String> bankComboBox;
@FXML private TextField accountField;
@FXML private TextField balanceField;
@FXML private DatePicker datePicker;
@FXML private ImageView previewImage;
@FXML private Button generateBtn;
@FXML private Button saveBtn;
private BufferedImage templateImage;
private BufferedImage generatedImage;
@FXML
public void initialize() {
// 初始化银行选项
bankComboBox.getItems().addAll(
"中国工商银行", "中国农业银行", "中国银行",
"中国建设银行", "交通银行", "招商银行"
);
bankComboBox.getSelectionModel().selectFirst();
// 设置默认日期为今天
datePicker.setValue(java.time.LocalDate.now());
// 加载模板图片
try {
templateImage = ImageIO.read(getClass().getResourceAsStream("/images/bank_template.png"));
previewImage.setImage(SwingFXUtils.toFXImage(templateImage, null));
} catch (IOException e) {
showAlert("错误", "无法加载模板图片!");
}
}
@FXML
private void handleGenerate() {
if (validateInput()) {
// 克隆模板图片进行编辑
generatedImage = new BufferedImage(
templateImage.getWidth(),
templateImage.getHeight(),
templateImage.getType()
);
// 图像处理逻辑
processImage();
// 更新预览
previewImage.setImage(SwingFXUtils.toFXImage(generatedImage, null));
saveBtn.setDisable(false);
}
}
@FXML
private void handleSave() {
if (generatedImage != null) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("保存截图");
fileChooser.getExtensionFilters().add(
new FileChooser.ExtensionFilter("PNG 图片", "*.png")
);
// 设置默认文件名
String fileName = String.format("%s_%s_%s.png",
bankComboBox.getValue(),
accountField.getText(),
new SimpleDateFormat("yyyyMMdd").format(new Date())
);
fileChooser.setInitialFileName(fileName);
File file = fileChooser.showSaveDialog(saveBtn.getScene().getWindow());
if (file != null) {
try {
ImageIO.write(generatedImage, "png", file);
showAlert("成功", "图片已保存到: " + file.getAbsolutePath());
} catch (IOException e) {
showAlert("错误", "保存图片失败: " + e.getMessage());
}
}
}
}
private boolean validateInput() {
// 验证逻辑
return true;
}
private void processImage() {
// 图像处理核心逻辑
}
private void showAlert(String title, String message) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle(title);
alert.setHeaderText(null);
alert.setContentText(message);
alert.showAndWait();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.image.ImageView?>
<VBox xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="com.bank.balance.controller.MainController"
spacing="10" style="-fx-padding: 10;">
<Label text="银行余额截图生成器" style="-fx-font-size: 18; -fx-font-weight: bold;"/>
<Separator/>
<HBox spacing="10">
<VBox spacing="5" style="-fx-padding: 0 10 0 0;">
<Label text="银行选择:"/>
<ComboBox fx:id="bankComboBox" prefWidth="200"/>
<Label text="账号:" style="-fx-padding: 10 0 0 0;"/>
<TextField fx:id="accountField" promptText="请输入银行账号"/>
<Label text="余额(元):" style="-fx-padding: 10 0 0 0;"/>
<TextField fx:id="balanceField" promptText="请输入余额金额"/>
<Label text="日期:" style="-fx-padding: 10 0 0 0;"/>
<DatePicker fx:id="datePicker"/>
<HBox spacing="10" style="-fx-padding: 20 0 0 0;">
<Button fx:id="generateBtn" text="生成截图" onAction="#handleGenerate"
style="-fx-base: #4CAF50; -fx-text-fill: white;"/>
<Button fx:id="saveBtn" text="保存图片" onAction="#handleSave"
style="-fx-base: #2196F3; -fx-text-fill: white;" disable="true"/>
</HBox>
</VBox>
<VBox spacing="5">
<Label text="预览:"/>
<ImageView fx:id="previewImage" fitWidth="500" fitHeight="300"
preserveRatio="true" smooth="true"/>
</VBox>
</HBox>
</VBox>
package com.bank.balance.util;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ImageProcessor {
public static BufferedImage processBankImage(BufferedImage template,
String bankName, String account, String balance, Date date) {
BufferedImage newImage = new BufferedImage(
template.getWidth(), template.getHeight(), template.getType()
);
Graphics2D g2d = newImage.createGraphics();
g2d.drawImage(template, 0, 0, null);
// 设置字体和颜色
Font font = new Font("微软雅黑", Font.PLAIN, 18);
g2d.setFont(font);
g2d.setColor(Color.BLACK);
// 绘制银行名称
g2d.drawString(bankName, 120, 80);
// 绘制账号
g2d.drawString(account, 120, 120);
// 绘制余额
String balanceStr = String.format("%,.2f", Double.parseDouble(balance));
g2d.drawString(balanceStr, 120, 160);
// 绘制日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
g2d.drawString(sdf.format(date), 120, 200);
g2d.dispose();
return newImage;
}
}