From 27291b14c60703a6021962682815ee3c66e43444 Mon Sep 17 00:00:00 2001 From: p6xlcrq3f <2020134472@qq.com> Date: Sun, 6 Apr 2025 21:31:49 +0800 Subject: [PATCH] ADD file via upload --- src/ThemeSwitcher.java | 172 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 src/ThemeSwitcher.java diff --git a/src/ThemeSwitcher.java b/src/ThemeSwitcher.java new file mode 100644 index 0000000..0edb1a2 --- /dev/null +++ b/src/ThemeSwitcher.java @@ -0,0 +1,172 @@ +package cn.edu.caztc.sokobangame; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Map; + +public class ThemeSwitcher { + // 当前主题索引 + private static int currentTheme = 1; + // 主题图片缓存 + private static Map themeIcons = new HashMap<>(); + + // 主题名称 + private static final String[] THEME_NAMES = { + "默认主题", + "chiikawa主题", + "MINECRAFT主题", + "粉色气泡主题" + }; + + // 初始化主题图片 + static { + loadThemeIcons(); + } + + // 加载所有主题的图片 + private static void loadThemeIcons() { + for (int theme = 1; theme <= THEME_NAMES.length; theme++) { + ImageIcon[] icons = new ImageIcon[7]; + String suffix = theme == 1 ? "" : "(" + (theme-1) + ")"; + + // 修改图片路径为images文件夹 + icons[0] = new ImageIcon("images/墙" + suffix + ".png"); + icons[1] = new ImageIcon("images/地板" + suffix + ".png"); + icons[2] = new ImageIcon("images/空箱子" + suffix + ".png"); + icons[3] = new ImageIcon("images/箱子" + suffix + ".png"); + icons[4] = new ImageIcon("images/箱子点" + suffix + ".png"); + icons[5] = new ImageIcon("images/player" + suffix + ".png"); + icons[6] = new ImageIcon("images/player2" + suffix + ".png"); + + themeIcons.put(theme, icons); + } + } + + // 创建切换主题菜单项 + public static JMenuItem createThemeMenuItem() { + JMenuItem themeItem = new JMenuItem("切换主题"); + themeItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + showThemeDialog(); + } + }); + return themeItem; + } + + // 显示主题选择对话框 + private static void showThemeDialog() { + JDialog dialog = new JDialog(); + dialog.setTitle("切换主题"); + dialog.setSize(600, 700); + dialog.setLayout(new BorderLayout()); + dialog.setLocationRelativeTo(null); + + JPanel mainPanel = new JPanel(new GridLayout(THEME_NAMES.length, 1, 10, 10)); + mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + + for (int i = 0; i < THEME_NAMES.length; i++) { + JPanel themePanel = createThemePanel(i + 1, THEME_NAMES[i]); + mainPanel.add(themePanel); + } + + JScrollPane scrollPane = new JScrollPane(mainPanel); + dialog.add(scrollPane, BorderLayout.CENTER); + + JButton closeButton = new JButton("关闭"); + closeButton.addActionListener(e -> dialog.dispose()); + JPanel buttonPanel = new JPanel(); + buttonPanel.add(closeButton); + dialog.add(buttonPanel, BorderLayout.SOUTH); + + dialog.setVisible(true); + } + + // 创建单个主题展示面板 + private static JPanel createThemePanel(int themeIndex, String themeName) { + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(BorderFactory.createTitledBorder(themeName)); + + JLabel titleLabel = new JLabel(themeName, JLabel.CENTER); + titleLabel.setFont(new Font("宋体", Font.BOLD, 16)); + panel.add(titleLabel, BorderLayout.NORTH); + + JPanel iconsPanel = new JPanel(new GridLayout(1, 7, 5, 5)); + ImageIcon[] icons = themeIcons.get(themeIndex); + + // 添加素材图片 + String[] iconNames = {"墙", "地板", "空箱子", "箱子", "箱子点", "玩家一", "玩家二"}; + for (int i = 0; i < 7; i++) { + JPanel iconPanel = new JPanel(new BorderLayout()); + iconPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + + // 缩放图片以适应显示 + ImageIcon scaledIcon = scaleIcon(icons[i], 50, 50); + JLabel iconLabel = new JLabel(scaledIcon); + iconLabel.setHorizontalAlignment(JLabel.CENTER); + iconPanel.add(iconLabel, BorderLayout.CENTER); + + JLabel nameLabel = new JLabel(iconNames[i], JLabel.CENTER); + iconPanel.add(nameLabel, BorderLayout.SOUTH); + + iconsPanel.add(iconPanel); + } + + JButton selectButton = new JButton("选择此主题"); + selectButton.addActionListener(e -> { + setCurrentTheme(themeIndex); + JOptionPane.showMessageDialog(null, "已切换至" + themeName, "提示", JOptionPane.INFORMATION_MESSAGE); + }); + + JPanel centerPanel = new JPanel(new BorderLayout()); + centerPanel.add(iconsPanel, BorderLayout.CENTER); + centerPanel.add(selectButton, BorderLayout.SOUTH); + panel.add(centerPanel, BorderLayout.CENTER); + + return panel; + } + + // 缩放图标 + private static ImageIcon scaleIcon(ImageIcon icon, int width, int height) { + if (icon == null) return null; + Image image = icon.getImage(); + Image scaledImage = image.getScaledInstance(width, height, Image.SCALE_SMOOTH); + return new ImageIcon(scaledImage); + } + + // 设置当前主题 + public static void setCurrentTheme(int theme) { + currentTheme = theme; + updateGameTheme(); + } + + // 更新游戏主题 + private static void updateGameTheme() { + ImageIcon[] currentIcons = themeIcons.get(currentTheme); + + // 更新游戏中的图标 + if (MainGame.getInstance() != null) { + MainGame.getInstance().updateTheme(currentIcons); + } + if (DualGame.getInstance() != null) { + DualGame.getInstance().updateTheme(currentIcons); + } + } + + // 获取当前主题的图标 + public static ImageIcon getThemeIcon(int index) { + ImageIcon[] icons = themeIcons.get(currentTheme); + if (icons != null && index >= 0 && index < icons.length) { + return icons[index]; + } + return null; + } + + // 添加方法获取当前主题的所有图标 + public static ImageIcon[] getCurrentThemeIcons() { + return themeIcons.get(currentTheme); + } +} \ No newline at end of file