我正在建立一个棋盘游戏,我有一个带空圈的网格。
我在photoshop中创建了自定义圆形标记(.png),然后在发生事件时将其“填满”或占据圆圈中的空白区域。我希望你明白我的意思。
我不完全确定使用paint()是唯一的方法。
任何人都可以提出一些关于如何实现这一目标的提示吗?我是GUI的新手。
这就是我的网格状态:
那些空白空间是我创造的标记必须占用的空间,但我不确定除了熟悉油漆之外我会做那些()
这是.png文件,当用户点击按钮时会“填满”空白区域
答案 0 :(得分:2)
看看这个想法。它将2个图像组合成“最终逻辑”外观:
我无法等待透明模板,所以我自己做了。 ;)
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);
}
}