2013-10-18 88 views
1

如何編程多個JButton對象以執行相同的任務?執行相同任務的多個JButton

我正在編寫一個在遊戲板上使用25個按鈕的遊戲。每個按鈕通過生成隨機數字並根據數字更改圖標來完成相同的操作。

這裏是我的代碼:

Random RG1 = new Random(); 
    level_1_random_block = (RG1.nextInt(6)); 

    final JButton btnNewButton = new JButton(""); 
    btnNewButton.addMouseListener(new MouseAdapter() { 

     public void mouseClicked(MouseEvent arg0) { 
      frame2.setVisible(false); 
      if (level_1_random_block == 0){ 
       btnNewButton.setIcon(new  ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreDiamond.png")); 
       score += 100; 
       initialize_score(); 
      } 
      if (level_1_random_block == 1){ 
       btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png")); 
       score += 25; 
       initialize_score(); 
      } 
      if (level_1_random_block == 2){ 
       btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png")); 
       score += 25; 
       initialize_score(); 
      } 
      if (level_1_random_block == 3){ 
       btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png")); 
       score += 5; 
       initialize_score(); 
      } 
      if (level_1_random_block == 4){ 
       btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png")); 
       score += 5; 
       initialize_score(); 
      } 
      if (level_1_random_block == 5){ 
       btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\creeper.png")); 
       score -= 30; 
       initialize_score(); 
      } 
      if (level_1_random_block == 6){ 
       btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\creeper.png")); 
       score -= 30; 
       initialize_score(); 
      } 

      btnNewButton.removeMouseListener(this); 
      level_1_move_on = true; 
      continue_game(); 

     } 
    }); 
    btnNewButton.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\grass_side.png")); 
    btnNewButton.setBounds(0, 0, 87, 87); 
    frame1.getContentPane().add(btnNewButton); 

一切工作正常,但我想知道是否有編程所有的按鈕要做到這一點,而無需編寫150個不同if報表的一個更簡單的方法。

回答

1

請勿添加鼠標偵聽器。就在你的類實現ActionListener:

public SomeClass implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     //Do your stuff here 
    } 
} 

,然後附加ActionListener到您的按鈕:

btn.addActionListener(this); 

或者我帶獨立課堂上提到:

public EventHandler implements ActionListener { 
    int level_1_random_block; 

    public EventHandler(int level_1_random_block) { 
     this.level_1_random_block = level_1_random_block;  
    } 

    public void actionPerformed(ActionEvent e) { 
     JButton source = (JButton)e.getSource(); 
     if (level_1_random_block == 0){ 
        source.setIcon(new  ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreDiamond.png")); 
        score += 100; 
        initialize_score(); 
       } 
       if (level_1_random_block == 1){ 
        source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png")); 
        score += 25; 
        initialize_score(); 
       } 
       if (level_1_random_block == 2){ 
        source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreGold.png")); 
        score += 25; 
        initialize_score(); 
       } 
       if (level_1_random_block == 3){ 
        source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png")); 
        score += 5; 
        initialize_score(); 
       } 
       if (level_1_random_block == 4){ 
        source.setIcon(new ImageIcon("C:\\Users\\Liam\\Desktop\\BOMB GAME\\oreIron.png")); 
        score += 5; 
        initialize_score(); 
       } 

    } 

} 

要在添加此監聽你的按鈕:

btn.addActionListener(new EventHandler(level_1_random_block)); 
+0

我唯一的問題是,按鈕需要改變它的圖標,但每個'btnNewButton.setIcon(新的ImageIcon(「C:\\ \\用戶Liam \\ Desktop \\ BOMB GAME \\ oreDiamond.png「));'特定於它正在改變的按鈕。我還能用這個嗎? – Hoberfinkle

+0

@Hoberfinkle是的!使用'ActionEvent#getSource()'和一個cast :) – NiziL

+1

是的。你可以創建實現'ActionListener'的分離類。您可以使用for循環在按鈕上添加「ActionListener」。但不幸的是,你將不得不把這個邏輯與'if'語句放在分離的類中。 –

0

如果所有的變化取決於隨機數是圖像路徑和得分值,爲什麼不把它們放入一個數組或類別中,並通過索引訪問它們?事實上,如果你以後需要不同的行爲,你可以編寫一個封裝這些字段的類(圖像和分數),並使用這個類的實例的數組/向量。這樣就很容易擴展。

4

那麼創建一個ActionListener子類,方法是重寫actionPerformed方法,然後創建它的一個實例,將相同的實例添加到您的用例的每個jButton對象中。

class MyActionListener implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // your action to be performed 
    } 
} 

注:MouseListener是在Swing其中ActionListener較高標籤和優選使用低級別AWT-事件偵聽器。然而,使用java.swing.Action本身更好,它本身不僅提供action-event處理,還集中處理動作事件觸發組件的狀態,例如tool bar buttons,,common buttonstext fields

查看How to Use Actions教程瞭解更多詳情。

+0

只需用'MouseListener'刪除那部分,我也會給你+1。別那麼固執。 :) –

+0

@brano,嗨(是)嗨(是)先生。對於固執抱歉。 :) – Sage

+0

現在**,**是一個可回答的答案。 :) –

2

一些提示:

  • 使用switch而不是多個if
  • 使用的ActionListener代替MouseListener
  • 在監聽器裏,獲得點擊的按鈕與ActionEvent#getSource()
  • 只能創建一個ActionListener並添加它所有按鈕

希望它能幫助:)

0

結交新類中會包含您的動作元數據:

class Action{ 
    String image; 
    int score; 
} 

定義情況下對自己的行爲,並把他們的一些數據結構,數組或列表,並與相應的索引標記它們。 然後你可以通過ID與他們聯繫。