Java 在JButton上绘制图像?
我正在制作一个棋盘游戏,我有一个带有空圆圈的网格Java 在JButton上绘制图像?,java,swing,icons,jbutton,Java,Swing,Icons,Jbutton,我正在制作一个棋盘游戏,我有一个带有空圆圈的网格 我在photoshop中创建了一个空圆圈的模板(.png),并重复添加(使用循环和布局管理器),然后用它创建多个按钮,并将它们放置在面板上 我还在photoshop中创建了自定义的循环标记(.png),在事件发生时,这些标记将有点“填满”或占据循环中的空白。我希望你明白我的意思 我不完全确定使用paint()是否是实现这一点的唯一方法 有谁能给我一些提示,告诉我如何做到这一点?我是新来的 这就是我的网格的外观: 这些空白是我创建的标记必须
- 我在photoshop中创建了一个空圆圈的模板(.png),并重复添加(使用循环和布局管理器),然后用它创建多个按钮,并将它们放置在面板上
请查看此文件,以了解您的想法。它结合了两幅图像,形成“最终逻辑”外观: 我等不起透明模板,所以我自己做了一个
import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
导入java.net.URL;
导入javax.imageio.imageio;
类游戏网格{
公共静态BuffereImage getImage(BuffereImage,布尔填充){
int pad=4;
BuffereImage temp=新的BuffereImage(
image.getWidth()+2*pad,
image.getHeight()+2*pad,
BuffereImage.TYPE_INT_ARGB);
Graphics2D g=临时createGraphics();
g、 setColor(Color.MAGENTA.darker());
椭圆E2D.Double椭圆=新的椭圆E2D.Double(
pad,pad,image.getWidth(),image.getHeight();
矩形2D.Double轮廓=新矩形2D.Double(
0,0,image.getWidth()+(2*pad),image.getHeight()+(2*pad));
a区=新区域(轮廓);
a、 减去(新面积(椭圆));
如果(填写){
g、 drawImage(图像,填充,填充,空);
}
g、 setClip(a);
g、 fillRect(0,0,image.getWidth()+(2*pad),image.getHeight()+(2*pad));
g、 处置();
返回温度;
}
公共静态void main(字符串[]args)引发异常{
URL=新URL(“http://i.stack.imgur.com/t5MFE.png");
BuffereImage image=ImageIO.read(url);
最终缓冲区图像img1=getImage(图像,真);
最终缓冲区图像img2=getImage(图像,假);
Runnable r=新的Runnable(){
@凌驾
公开募捐{
jpanelgui=newjpanel(newgridlayout(0,3));
ActionListener al=新的ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
JButton b=(JButton)e.getSource();
b、 设置图标(新图像图标(img2));
}
};
对于(int ii=0;ii)你知道你不必正确地绘制它们吗?你可以将它们用作按钮的图标。按钮。setIcon(Icon)
。或者只是按钮=新的JButton(Icon);
将setIcon
只是将标记添加到按钮中,比如“填充”空白空间(我编辑它以使其适合空白空间),而不删除我之前分配给它的空圆圈图像?因为这正是我所需要的,以便令牌和正方形(空圆圈模板)同时可见。“在事件发生时获取圆圈中的空空间。”具体是什么事件?你能给我们展示各种图标吗?请注意,我认为最好的方法是使用JToggleButton
,第一个图标作为默认图标,组合图标作为“按下的图标”。“我有一个带有空圆圈的网格“你能给出这个网格的更多细节吗?”或者有其他方法解决这个问题吗?”不容易。在“零零碎碎”地获取信息的同时,想出最佳方法也不容易……哇,谢谢你。不过我已经上传了透明模板(在评论中;非常抱歉等待),如果你不介意的话,你能应用它吗?如果你不介意的话。:)很抱歉,这是调整大小的文件:模板:标记:啊..我只是想说:A)我不明白这两张图片应该如何一起工作,大小不同,B)因为我用更好的填充和背景颜色编辑了我的答案,我真的不想在没有看到“最佳尝试”的情况下进行进一步的修改你的部分。仔细查看代码,看看你是否可以编辑它来组合模板和填充图像。发布一个(最小的完整测试和可读示例)当然,非常感谢你的时间和努力,我已经掌握了你的代码的诀窍,虽然我想我会有一个小问题,不只是简单地使用素色作为轮廓,而是实际使用.png模板,但我会尝试看看我最终会得到什么,然后我会返回这里。谢谢!好的。这里有一个提示。更改getImage
方法参数以接受两个图像。首先绘制“圆形”图像,然后绘制“模板”图像。其余大部分可以删除(处理区域
对象)。
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);
}
}