文章附件下载:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:7893
这是一个完整的小红书私信卡片生成器Java应用程序
使用Swing GUI框架创建用户界面
支持自定义卡片标题、内容、链接和风格
提供5种不同风格的卡片模板
可以实时预览生成的卡片效果
支持将生成的卡片保存为PNG图片
包含Maven配置文件,可直接打包为可执行JAR
import javax.swing.;
import java.awt.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class RedBookCardGenerator {
private JFrame frame;
private JTextField titleField;
private JTextArea contentArea;
private JTextField linkField;
private JComboBox styleComboBox;
private JLabel previewLabel;
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
try {
new RedBookCardGenerator().initialize();
} catch (Exception e) {
e.printStackTrace();
}
});
}
private void initialize() {
frame = new JFrame("小红书卡片生成器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setLayout(new BorderLayout());
// 顶部面板
JPanel topPanel = new JPanel();
topPanel.setLayout(new FlowLayout());
topPanel.add(new JLabel("小红书卡片生成器", JLabel.CENTER));
// 左侧输入面板
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new GridLayout(5, 1, 10, 10));
titleField = new JTextField("输入标题");
contentArea = new JTextArea("输入内容...");
contentArea.setLineWrap(true);
JScrollPane contentScroll = new JScrollPane(contentArea);
linkField = new JTextField("输入跳转链接");
String[] styles = {"默认风格", "美食风格", "旅行风格", "美妆风格", "穿搭风格"};
styleComboBox = new JComboBox<>(styles);
inputPanel.add(new JLabel("标题:"));
inputPanel.add(titleField);
inputPanel.add(new JLabel("内容:"));
inputPanel.add(contentScroll);
inputPanel.add(new JLabel("链接:"));
inputPanel.add(linkField);
inputPanel.add(new JLabel("选择风格:"));
inputPanel.add(styleComboBox);
// 右侧预览面板
JPanel previewPanel = new JPanel();
previewLabel = new JLabel();
previewLabel.setPreferredSize(new Dimension(300, 400));
previewPanel.add(previewLabel);
// 底部按钮面板
JPanel buttonPanel = new JPanel();
JButton generateButton = new JButton("生成卡片");
JButton saveButton = new JButton("保存图片");
generateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updatePreview();
}
});
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveImage();
}
});
buttonPanel.add(generateButton);
buttonPanel.add(saveButton);
// 添加组件到主窗口
frame.add(topPanel, BorderLayout.NORTH);
frame.add(inputPanel, BorderLayout.WEST);
frame.add(previewPanel, BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
private void updatePreview() {
// 创建预览图片
BufferedImage image = new BufferedImage(300, 400, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 根据选择的风格设置背景色
String style = (String)styleComboBox.getSelectedItem();
switch(style) {
case "美食风格":
g.setColor(new Color(255, 240, 220));
break;
case "旅行风格":
g.setColor(new Color(220, 240, 255));
break;
case "美妆风格":
g.setColor(new Color(255, 220, 240));
break;
case "穿搭风格":
g.setColor(new Color(240, 220, 255));
break;
default:
g.setColor(new Color(240, 240, 240));
}
g.fillRect(0, 0, 300, 400);
g.setColor(Color.BLACK);
// 绘制标题
g.setFont(new Font("微软雅黑", Font.BOLD, 18));
drawCenteredString(g, titleField.getText(), new Rectangle(0, 20, 300, 30));
// 绘制内容
g.setFont(new Font("微软雅黑", Font.PLAIN, 14));
drawWrappedText(g, contentArea.getText(), new Rectangle(20, 60, 260, 280));
// 绘制底部链接
g.setFont(new Font("微软雅黑", Font.ITALIC, 12));
g.setColor(Color.BLUE);
drawCenteredString(g, "点击查看详情 →", new Rectangle(0, 350, 300, 30));
// 更新预览
previewLabel.setIcon(new ImageIcon(image));
}
private void drawCenteredString(Graphics g, String text, Rectangle rect) {
FontMetrics metrics = g.getFontMetrics();
int x = rect.x + (rect.width - metrics.stringWidth(text)) / 2;
int y = rect.y + ((rect.height - metrics.getHeight()) / 2) + metrics.getAscent();
g.drawString(text, x, y);
}
private void drawWrappedText(Graphics g, String text, Rectangle rect) {
FontMetrics metrics = g.getFontMetrics();
String[] words = text.split(" ");
String currentLine = "";
int y = rect.y + metrics.getAscent();
for (String word : words) {
String testLine = currentLine.isEmpty() ? word : currentLine + " " + word;
if (metrics.stringWidth(testLine) < rect.width) {
currentLine = testLine;
} else {
g.drawString(currentLine, rect.x, y);
y += metrics.getHeight();
currentLine = word;
}
}
if (!currentLine.isEmpty()) {
g.drawString(currentLine, rect.x, y);
}
}
private void saveImage() {
try {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("保存卡片图片");
if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
if (!file.getName().toLowerCase().endsWith(".png")) {
file = new File(file.getParentFile(), file.getName() + ".png");
}
ImageIcon icon = (ImageIcon)previewLabel.getIcon();
BufferedImage image = new BufferedImage(
icon.getIconWidth(),
icon.getIconHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
ImageIO.write(image, "png", file);
JOptionPane.showMessageDialog(frame, "图片保存成功!");
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(frame, "保存失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
}
}