看看這個想法。它結合了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);
}
}
你知道你不必畫它們嗎?您可以將它們用作按鈕的「圖標」。 'button.setIcon(圖標)'。或者只是'button = new JButton(icon);' –
''setIcon'只是將該標記添加到按鈕中,就像「填充」空白空間(我編輯它以適合空白空間),而不是刪除我分配給它之前的空圈圖像?因爲這就是我需要的,因爲令牌和方塊(空圓圈模板)同時可見。 – user3026693
*「發生事件時,請在圈子中留出空白。」*具體是什麼事件?你能告訴我們各種圖標嗎?請注意,我懷疑最好的方法是使用一個JToggleButton,第一個圖標作爲默認圖標,並將組合圖標作爲「已按下的圖標」。 –