2014-03-03 50 views
0

我正在試着做一個像珠寶首飾或candycrush作業的遊戲。這幾乎結束了。但我有一個小問題。現在,當我點擊時,具有相同圖標的按鈕彈出,上面的圖片即將到來,而不是爆炸。但速度太快了。我該如何減緩此事件?或者我可以添加效果?如何將效果添加到JButton的圖標?

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

}

+0

暫停(50); 使用Java的暫停 – KRUKUSA

回答

0

當你想添加一個延遲到這樣的「動畫」,那麼你就必須使用Thread.sleep(ms)

這個代碼包含在actionPerformed方法,所以你不能使用Thread.sleep(ms)直接,因爲這會阻止事件分派線程(EDT)和圖形用戶界面將成爲inresponsive。

所以你必須用自己的線程執行這個「動畫」。

你可能不超過EDT一個不同線程中調用Button#setIcon(...)

所以實際的解決方案在這裏有點棘手 - 你必須在兩個線程之間「ping-pong」責任(或者,你可以使用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()); 
     } 
    } 
} 

BTW:你不應該比較String對象與if (string0==string1) ...,但總是與if (string0.equals(string1)) ...

+0

謝謝。比你非常。當我問問題時,你很快就會回答。順便說一句,我不會說英語很好。非常抱歉。 – rdmzcn