首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将效果添加到JButton的图标中?

如何将效果添加到JButton的图标中?
EN

Stack Overflow用户
提问于 2014-03-03 19:36:11
回答 1查看 132关注 0票数 0

我正试着做一个像珠宝或糖果之类的家庭作业游戏。都快结束了。但我有个小问题。现在,当我点击,按钮有相同的图标弹出,上面的图片来了,而不是爆炸。但速度太快了。我怎样才能减缓这一事件?或者我能增加效果吗?

代码语言:javascript
复制
public class ButtonActionListener implements ActionListener {
public JButton previousButton = null;
public int numP, numC;
public JButton[] buttons=butondeneme.getButton();

@Override
public void actionPerformed(ActionEvent e){


    // TODO Auto-generated method stub
    JButton currentButton = (JButton)e.getSource();

    if (previousButton == null) {
        previousButton = currentButton;
        return;
    }

    int numP=Integer.parseInt(((JButton)previousButton).getActionCommand());
    int numC=Integer.parseInt(((JButton)currentButton).getActionCommand());

    //change picture of icons that clicked
    if (numP==(numC+1) || numP==(numC-1) || numP==(numC+8) || numP==(numC-8) ){
        Icon previousIcon = previousButton.getIcon();
        Icon currentIcon = currentButton.getIcon();
        currentButton.setIcon(previousIcon);
        previousButton.setIcon(currentIcon);
        previousButton = null;

    }
    else
        previousButton=null;

    Random r = new Random();
    int a = r.nextInt(64);
    int b = r.nextInt(64);
    int c = r.nextInt(64);

    //buttons that have same picture are explode.
    for(int i=0; i<63; i++){
        if(buttons[i].getIcon().toString()==buttons[i+1].getIcon().toString() && 
                buttons[i+1].getIcon().toString()== buttons[i+2].getIcon().toString() ){                                            
            //System.out.println("slm");
            if(i > 7){
                buttons[i].setIcon(buttons[i-8].getIcon());
                buttons[i+1].setIcon(buttons[i-7].getIcon());
                buttons[i+2].setIcon(buttons[i-6].getIcon());

                for(int j = i; j > 0; j=j-8){
                    if(j > 7){
                        buttons[j].setIcon(buttons[j-8].getIcon());
                        buttons[j+1].setIcon(buttons[j-7].getIcon());
                        buttons[j+2].setIcon(buttons[j-6].getIcon());
                    }
                    else{
                        buttons[j].setIcon(buttons[a].getIcon());
                        buttons[j+1].setIcon(buttons[b].getIcon());
                        buttons[j+2].setIcon(buttons[c].getIcon());
                    }

                }
            }
            else{
                buttons[i].setIcon(buttons[a].getIcon());
                buttons[i+1].setIcon(buttons[b].getIcon());
                buttons[i+2].setIcon(buttons[c].getIcon());
            }
        }
    }

}

}    

在这个类中,我创建了框架、按钮和随机图标。

代码语言:javascript
复制
public class butondeneme extends JFrame{

private JPanel grid;
public String comand;
public static JButton[] buttons;
public String imgName;

public butondeneme(){

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 640, 640);
grid=new JPanel();
grid.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
grid.setLayout(new GridLayout(8,8,5,5));    
buttons = new JButton[64];


   //Creating random image for buttons
   ActionListener buttonActionListener = new ButtonActionListener();
     for (int i = 0; i<buttons.length; i++) {

            Random r = new Random();
            int a = r.nextInt(9)+1;
            switch(a){
            case 1 : buttons[i]=new JButton(new ImageIcon("img//Cakal.png"));
                    break;
            case 2 : buttons[i]=new JButton(new ImageIcon("img//BugsBunny.png"));
                    break;
            case 3 : buttons[i]=new JButton(new ImageIcon("img//Pig.png"));
                    break;
            case 4 : buttons[i]=new JButton(new ImageIcon("img//Taz.png"));
                    break;
            case 5 : buttons[i]=new JButton(new ImageIcon("img//Sam.png"));
                    break;
            case 6 : buttons[i]=new JButton(new ImageIcon("img//DuffyDuck.png"));
                    break;
            case 7 : buttons[i]=new JButton(new ImageIcon("img//Tweety.png"));
                    break;
            case 8 : buttons[i]=new JButton(new ImageIcon("img//Slyvester.png"));
                    break;
            case 9 : buttons[i]=new JButton(new ImageIcon("img//RoadRunner.png"));
                    break;
            }

            //Adding number to find easily
            comand=Integer.toString(i);

            //Get ImageIcon name
            imgName=((ImageIcon)buttons[i].getIcon()).toString();

            buttons[i].addActionListener(buttonActionListener);
            buttons[i].setActionCommand(comand);

            grid.add(buttons[i]);

      }


add(grid);


}

static JButton[] getButton(){
return buttons;
}

public static void main(String[] args){
    butondeneme erdem=new butondeneme();
    erdem.setVisible(true);
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-03 20:18:07

当您想要向这样的“动画”添加延迟时,您必须使用Thread.sleep(ms)

但是--这段代码包含在actionPerformed方法中,所以不能直接使用Thread.sleep(ms),因为这会阻塞Event (EDT),而GUI将变得没有响应。

所以你必须用自己的线程来执行这个“动画”。

,但是,您不能在不同于EDT的线程上调用Button#setIcon(...)

因此,实际的解决方案在这里有点棘手-您必须“乒乓”两个线程之间的责任(或者,您可以使用一个javax.swing.Timer,但我认为这可能需要您的原始代码更多的重组.尽管我并不完全理解您在那里做什么(也就是说,您要在那里更改哪些图标,原因是什么)。

然而,这种做法的总体结构大致如下:

代码语言:javascript
复制
@Override
public void actionPerformed(ActionEvent e){

    ...
    //buttons that have same picture are explode.
    startAnimation();
}


private void startAnimation()
{
    Thread t = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            runAnimation();
        }
    });
    t.start();
}

private int a;
private int b;
private int c;
private void runAnimation()
{
    Random r = new Random();
    a = r.nextInt(64);
    b = r.nextInt(64);
    c = r.nextInt(64);

    for(int i=0; i<63; i++)
    {
        final int iFinal = i;
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                doAnimationStep(iFinal);
            }
        });

        try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
            Thread.currentThread().interrupt();
            return;
        }
    }
}

private void doAnimationStep(int i)
{
    String s0 = buttons[i].getIcon().toString();
    String s1 = buttons[i+1].getIcon().toString();
    String s2 = buttons[i+2].getIcon().toString();
    if(s0.equals(s1) && s1.equals(s2))
    {
        //System.out.println("slm");
        if(i > 7){
            buttons[i].setIcon(buttons[i-8].getIcon());
            buttons[i+1].setIcon(buttons[i-7].getIcon());
            buttons[i+2].setIcon(buttons[i-6].getIcon());

            for(int j = i; j > 0; j=j-8){
                if(j > 7){
                    buttons[j].setIcon(buttons[j-8].getIcon());
                    buttons[j+1].setIcon(buttons[j-7].getIcon());
                    buttons[j+2].setIcon(buttons[j-6].getIcon());
                }
                else{
                    buttons[j].setIcon(buttons[a].getIcon());
                    buttons[j+1].setIcon(buttons[b].getIcon());
                    buttons[j+2].setIcon(buttons[c].getIcon());
                }

            }
        }
        else{
            buttons[i].setIcon(buttons[a].getIcon());
            buttons[i+1].setIcon(buttons[b].getIcon());
            buttons[i+2].setIcon(buttons[c].getIcon());
        }
    }
}

顺便说一下:您不应该将String对象与if (string0==string1) ...进行比较,而应始终将其与if (string0.equals(string1)) ...进行比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22155673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档