【问题标题】:How effects are added to the icon of JButton?JButton的图标如何添加效果?
【发布时间】:2014-03-03 19:36:11
【问题描述】:

我正在尝试为家庭作业制作像宝石迷阵或糖果粉碎这样的游戏。快结束了。但我有一个小问题。现在,当我单击时,会弹出具有相同图标的按钮,并且上面的图片会出现而不是爆炸。但它发展得太快了。我怎样才能减慢这个事件?或者我可以添加效果吗?

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());
            }
        }
    }

}

}    

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

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);
}

}

【问题讨论】:

  • 暂停(50);使用 Java 的暂停

标签: java swing jbutton effects


【解决方案1】:

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

但是此代码包含在actionPerformed 方法中,因此您不能直接使用Thread.sleep(ms),因为这会阻塞事件调度线程(EDT)并且GUI 会变得迟钝。

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

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

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

但是,这种方法的一般结构大致如下所示:

@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)) ... 进行比较

【讨论】:

  • 谢谢。非常感谢你。当我问问题时,你很快就会回答。顺便说一句,我英语说得不太好。很抱歉。
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 2011-06-15
  • 2012-02-18
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多