1

我正在制作一个需要为每个部分分配信息的拼图应用程序。这是一张照片。

在照片中,我刚刚将每个拼图块打印到屏幕上。

碎片是在显示之前生成的,碎片的数量不同。例如,我想要一个 9x9 块的拼图……所以我需要 9x9 或 81 个按钮……

选择后,按钮或片段会突出显示。选择时以及单击其他按钮(例如分配位置)时,将执行/处理比片数据和按钮的动作。一次只能选择一个按钮..

就数据和功能而言,我已经完成了所有工作。

我只需要弄清楚如何制作按钮并使它们可选择。

4

1 回答 1

1

看看这个例子是否给你一些想法:

在此处输入图像描述

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

class ImageButtonFun {

    public static void main(String[] args) throws Exception {
        URL url1 = new URL("http://i.stack.imgur.com/XZ4V5.jpg");
        final BufferedImage img1 = ImageIO.read(url1);
        URL url2 = new URL("http://i.stack.imgur.com/7bI1Y.jpg");
        final BufferedImage img2 = ImageIO.read(url2);
        final int sW = img2.getWidth();
        final int sH = img2.getHeight();
        final int tileW = 40;
        final int tileH = 40;
        Runnable r = new Runnable() {
        @Override
            public void run() {
                JPanel gui = new JPanel(new GridLayout(8,12));
                ButtonGroup bg = new ButtonGroup();
                for (int jj=0; jj<sH/tileH; jj++) {
                    for (int ii=0; ii<sW/tileW; ii++) {
                        Image im1 = img1.getSubimage(ii*tileW, jj*tileH, tileW, tileH);
                        Image im2 = img2.getSubimage(ii*tileW, jj*tileH, tileW, tileH);
                        JToggleButton button = new JToggleButton(new ImageIcon(im1));
                        button.setSelected( (ii%2==0 && jj%2==0) || (ii%2==1 && jj%2==1));
                        button.setSelectedIcon(new ImageIcon(im2));
                        button.setContentAreaFilled(false);
                        button.setBorderPainted(false);
                        button.setBorder(null);
                        bg.add(button);  // ensure only one button is selected at a time
                        gui.add(button);
                    }
                }

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

这些图像在代码和标记问答的示例图像中看到。

编辑

一次只能选择一个按钮..

为此使用 a ButtonGroup

ButtonGroup组件管理一组按钮的选中/未选中状态。对于组,ButtonGroup实例保证一次只能选择一个按钮。

于 2013-10-28T14:40:47.213 回答