迎接龙年:Java Swing打造龙年祝福语-以作纪念!

一、前言

Swing是一个为Java设计的GUI工具包,属于Java基础类的一部分。Swing包括了图形用户界面(GUI)功能,其组件包含:文本框、文本域、按钮、表格、列表等。

看着这个熟悉又陌生的界面,相信对大多数人来说Java Swing已经淡出了我们的视线。

再看看下面的界面,好像风格与上面完全不一样,但的确不这Swing。

原来Swing提供了可编程渲染模型,使用户可以对渲染细节进行控制。也就是使用了LAF,那么什么是LAF呢?

Java Swing LAF(Look and Feel)是用于更改Java Swing组件的外观和感觉的库。LAF可以为应用程序提供统一的视觉风格,并使其更具吸引力和易用。

二、Swing+LAF生成龙年祝福

以下就是使用Java Swing+Laf实现的龙年祝福语生成器:

java 复制代码
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import javax.imageio.ImageIO;

public class DragonYearWishesGenerator extends JFrame {

    private JLabel wishesLabel;
    private JButton generateWishesButton;
    private JButton copyButton;
    private JLabel dragonImageLabel;
    private JCheckBox redCheckbox;
    private JCheckBox blueCheckbox;
    private JCheckBox greenCheckbox;

    private final String[] dragonYearWishes = {
            "龙年大吉,好运连连!",
            "祝福你在新的一年里腾飞如龙!",
            "龙年到,幸福跟着走,万事如意!",
            "龙年到,祝福到,祝愿大家龙年快乐!",
            "腾四海,福满人间。2024年开门红,事业有成,财源广进!",
            "龙年神兽守护您,幸福平安陪伴您!愿您龙年事业蒸蒸日上,家庭和和美美!"
            // 添加更多祝福语...
    };

  	//图片放在与class文件同目录
    private final String[] dragonImages = {
            "img1.jpg",
            "img2.jpg",
            "img3.jpg"
            // 添加更多龙年图片资源路径...
    };

    public DragonYearWishesGenerator() {
        initializeUI();
    }

    private void initializeUI() {
        // 设置Darcula外观
        try {
            UIManager.setLookAndFeel("com.bulenkov.darcula.DarculaLaf");
        } catch (Exception e) {
            e.printStackTrace();
        }

        SwingUtilities.updateComponentTreeUI(this);
        this.setSize(400, 200);
        setTitle("龙年祝福语生成器");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 上层:字体颜色勾选
        JPanel colorCheckboxPanel = new JPanel();
        redCheckbox = new JCheckBox("红色");
        blueCheckbox = new JCheckBox("蓝色");
        greenCheckbox = new JCheckBox("绿色");

        // 添加颜色选择监听器
        redCheckbox.addActionListener(e -> updateFontColor());
        blueCheckbox.addActionListener(e -> updateFontColor());
        greenCheckbox.addActionListener(e -> updateFontColor());

        colorCheckboxPanel.add(redCheckbox);
        colorCheckboxPanel.add(blueCheckbox);
        colorCheckboxPanel.add(greenCheckbox);

        add(colorCheckboxPanel, BorderLayout.NORTH);

        // 中间层:随机选择龙年图片
        generateWishesButton = new JButton("生成龙年祝福语");
        generateWishesButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                displayRandomDragonImage();
            }
        });
        add(generateWishesButton, BorderLayout.CENTER);

        dragonImageLabel = new JLabel();
        dragonImageLabel.setHorizontalAlignment(JLabel.CENTER);
        add(dragonImageLabel, BorderLayout.CENTER);

        // 最下层:龙年祝福语和复制按钮
        wishesLabel = new JLabel();
        wishesLabel.setHorizontalAlignment(JLabel.CENTER);
        add(wishesLabel, BorderLayout.SOUTH);

        copyButton = new JButton("复制");
        copyButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                copyWishesToClipboard();
            }
        });

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(generateWishesButton);
        buttonPanel.add(copyButton);

        add(buttonPanel, BorderLayout.EAST);

        // 设置窗体大小为600x600
        setSize(600, 600);

        pack();
        setLocationRelativeTo(null);
    }

    private void displayRandomDragonImage() {
        // 随机选择一张龙年图片并显示在中间层
        Random random = new Random();
        int index = random.nextInt(dragonImages.length);

        try {
            // 从文件加载图片
            InputStream stream = getClass().getResourceAsStream(dragonImages[index]);
            BufferedImage image = ImageIO.read(stream);
            // 设置图片到中间层组件
            dragonImageLabel.setIcon(new ImageIcon(image));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 随机选择一条祝福语并显示在最下层
        index = random.nextInt(dragonYearWishes.length);
        wishesLabel.setText(dragonYearWishes[index]);

        // 根据选择的颜色修改字体颜色
        updateFontColor();
    }

    private void copyWishesToClipboard() {
        // 复制祝福语到剪贴板
        String wishes = wishesLabel.getText();
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(new StringSelection(wishes), null);
        JOptionPane.showMessageDialog(this, "祝福语已复制到剪贴板!");
    }

    private void updateFontColor() {
        // 根据选择的颜色修改字体颜色
        Color fontColor = Color.BLACK; // 默认黑色

        if (redCheckbox.isSelected()) {
            fontColor = Color.RED;
        } else if (blueCheckbox.isSelected()) {
            fontColor = Color.BLUE;
        } else if (greenCheckbox.isSelected()) {
            fontColor = Color.GREEN;
        }

        wishesLabel.setForeground(fontColor);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DragonYearWishesGenerator().setVisible(true);
            }
        });
    }
}

三、Swing外观

3.1、使用Swing的产品

  • IntelliJ IDEA
  • Google Android Studio

还有Eclipse、NetBeans、Mapollage、Jotasync、Apache JMeter等,目前来看好像主要就在IDE这个领域中应用。

3.2、LAF

LAF 指的是 "Look and Feel",它是用户界面设计中的一个概念,用于描述应用程序或窗体的外观和感觉。在 Java Swing 中,LAF 是一种机制,允许开发人员轻松地更改应用程序的外观,以使其适应不同的操作系统或用户偏好。

Java Swing 库提供了一组默认的 Look and Feel,例如 Metal、Nimbus 等。每个 Look and Feel 都定义了组件的外观和行为,以便它们在屏幕上显示为特定的外观风格。用户可以选择使用不同的 Look and Feel 来改变应用程序的外观,以使其与操作系统或其他应用程序一致。

一些第三方库也提供了自定义的 Look and Feel:

  • DarculaLaf

DarculaLaf,它模仿了 IntelliJ IDEA 的深色外观风格(Dark Theme)。Darcula 是 Java 桌面应用程序的 Look-n-Feel 和代码编辑器主题。该存储库主要关注 Java 外观,并包含现成的库。

  • FlatLaf

FlatLaf 是一个现代的 Java Swing Look and Feel,它提供了扁平化的外观,适用于创建现代化和清晰的用户界面。FlatLaf 通过提供扁平化的设计元素、清晰的图标和现代化的外观,使得 Swing 应用程序能够呈现现代风格的用户界面。

还有一些出色的LAF如JTattoo、WebLaF、Quaqua 等等。

Java Swing主要集中在 IDE(集成开发环境),如 IntelliJ IDEA, Eclipse, NetBeans 等,相比与QT之类的GUI,Java Swing的前景并不乐观。想当年老师还是教了好几堂课的,用此程序纪念一下。祝愿大家在这龙年里好运连连!!🏮🏮🏮

相关推荐
San813_LDD1 小时前
[C语言]《Dev-C++ 报错解决手册(Day0607 精华版)》
java·前端·javascript
Anastasiozzzz2 小时前
从有限状态机到智能体图:传统 FSM 与 Agent Graph的演进
java·人工智能·python·ai
GetcharZp7 小时前
GitHub 49K+ Star!C++ 开发者必知的 JSON 神级库:从零到精通全指北
后端
xujinwei_gingko7 小时前
SpringBoot整合WebSocket
spring boot·后端·websocket
智码看视界8 小时前
现代Web开发基础:全栈工程师的起航点
前端·后端·c5全栈
程序员cxuan8 小时前
Claude Fable 5 来了
人工智能·后端·程序员
JS菌8 小时前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
wang09078 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java9 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis