Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JButton上绘制图像?_Java_Swing_Icons_Jbutton - Fatal编程技术网

Java 在JButton上绘制图像?

Java 在JButton上绘制图像?,java,swing,icons,jbutton,Java,Swing,Icons,Jbutton,我正在制作一个棋盘游戏,我有一个带有空圆圈的网格 我在photoshop中创建了一个空圆圈的模板(.png),并重复添加(使用循环和布局管理器),然后用它创建多个按钮,并将它们放置在面板上 我还在photoshop中创建了自定义的循环标记(.png),在事件发生时,这些标记将有点“填满”或占据循环中的空白。我希望你明白我的意思 我不完全确定使用paint()是否是实现这一点的唯一方法 有谁能给我一些提示,告诉我如何做到这一点?我是新来的 这就是我的网格的外观: 这些空白是我创建的标记必须

我正在制作一个棋盘游戏,我有一个带有空圆圈的网格

  • 我在photoshop中创建了一个空圆圈的模板(.png),并重复添加(使用循环和布局管理器),然后用它创建多个按钮,并将它们放置在面板上
我还在photoshop中创建了自定义的循环标记(.png),在事件发生时,这些标记将有点“填满”或占据循环中的空白。我希望你明白我的意思

我不完全确定使用paint()是否是实现这一点的唯一方法

有谁能给我一些提示,告诉我如何做到这一点?我是新来的

这就是我的网格的外观:

这些空白是我创建的标记必须占用的空间,但我不确定除了熟悉画画之外,我是否会这样做()

这是一个.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);
    }
}