在JButton上绘制图像?

时间:2014-02-07 11:34:16

标签: java swing icons jbutton

我正在建立一个棋盘游戏,我有一个带空圈的网格。

  • 我在photoshop中创建了一个空白圆圈的模板(.png)并重复添加(使用循环和布局管理器)并用它创建多个按钮并将它们放在面板上。

我在photoshop中创建了自定义圆形标记(.png),然后在发生事件时将其“填满”或占据圆圈中的空白区域。我希望你明白我的意思。

我不完全确定使用paint()是唯一的方法。

任何人都可以提出一些关于如何实现这一目标的提示吗?我是GUI的新手。

这就是我的网格状态:

enter image description here

enter image description here

那些空白空间是我创造的标记必须占用的空间,但我不确定除了熟悉油漆之外我会做那些()

这是.png文件,当用户点击按钮时会“填满”空白区域

enter image description here

1 个答案:

答案 0 :(得分:2)

看看这个想法。它将2个图像组合成“最终逻辑”外观:

enter image description here

我无法等待透明模板,所以我自己做了。 ;)

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

class GameGrid {

    public static BufferedImage getImage(BufferedImage image, boolean fill) {
        int pad = 4;
        BufferedImage temp = new BufferedImage(
                image.getWidth()+2*pad,
                image.getHeight()+2*pad,
                BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = temp.createGraphics();
        g.setColor(Color.MAGENTA.darker());
        Ellipse2D.Double ellipse = new Ellipse2D.Double(
                pad, pad, image.getWidth(), image.getHeight());
        Rectangle2D.Double outline = new Rectangle2D.Double(
                0, 0, image.getWidth()+(2*pad), image.getHeight()+(2*pad));
        Area a = new Area(outline);
        a.subtract(new Area(ellipse));
        if (fill) {
            g.drawImage(image,pad,pad,null);
        }
        g.setClip(a);
        g.fillRect(0, 0, image.getWidth()+(2*pad), image.getHeight()+(2*pad));
        g.dispose();

        return temp;
    }

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://i.stack.imgur.com/t5MFE.png");
        BufferedImage image = ImageIO.read(url);

        final BufferedImage img1 = getImage(image, true);
        final BufferedImage img2 = getImage(image, false);
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JPanel gui = new JPanel(new GridLayout(0,3));

                ActionListener al = new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JButton b = (JButton)e.getSource();
                        b.setIcon(new ImageIcon(img2));
                    }
                };

                for (int ii=0; ii<9; ii++) {
                    JButton b = new JButton(new ImageIcon(img1));
                    b.setBackground(Color.RED);
                    //b.setContentAreaFilled(false);
                    b.setBorder(null);
                    b.addActionListener(al);
                    gui.add(b);
                }

                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);
    }
}