likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 1

一、前言

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

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

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

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

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

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

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

二、Swing+LAF生成龙年祝福

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

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

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

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

  • Google Android Studio

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

还有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 应用程序能够呈现现代风格的用户界面。

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

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

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

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