2012-11-09 38 views
0

我想添加ActionEvent到81 JButtons如何使用尽可能少的代码来做到这一点?我试过使用循环来完成这项工作,但我在程序本身遇到问题。这是我认为足以从中获得答案的代码的一部分。为许多JButton添加ActionEvent

public void actionPerformed(ActionEvent e) { 
    if(e.getSource()==tiles[0]) { 
     n=0; 
     x=1; 
     y=1; 
     detectMines(); 
     setProperties(n,x,y); 
    } 

    if(e.getSource()==tiles[1]) { 
     n=1; 
     x=1; 
     y=2; 
     detectMines(); 
     setProperties(n,x,y); 
    } 

    if(e.getSource()==tiles[2]) { 
     n=2; 
     x=1; 
     y=3; 
     detectMines(); 
     setProperties(n,x,y); 
    } 

    if(e.getSource()==tiles[3]) { 
     n=3; 
     x=1; 
     y=4; 
     detectMines(); 
     setProperties(n,x,y); 
    } 

    if(e.getSource()==tiles[4]) { 
     n=4; 
     x=1; 
     y=5; 
     detectMines(); 
     setProperties(n,x,y); 
    } 

    if(e.getSource()==tiles[5]) { 
     n=5; 
     x=1; 
     y=6; 
     detectMines(); 
     setProperties(n,x,y); 
    } 

你都知道了,这里是我的代码使用上面也许这将帮助解决这里我的问题的功能。

public void setProperties(int n, int x, int y){ 
    if(grid[x][y]=="1") { 
     slives--; 
     Icon phpicon = new ImageIcon(getClass().getResource("resources/"+p1hp[slives])); 
     shp.setIcon(phpicon); 
     tiles[n].setIcon(icon);  
     tiles[n].setDisabledIcon(icon); 
     tiles[n].setEnabled(false); 
     mines=0;  
     if(slives==0){ 
      message = "lose"; 
      sendData(message); 
      JOptionPane.showMessageDialog(null,"You Have No Life Left! You Lose!"); 
      System.exit(0); 
     } 
     else{ 
      message = "mines"; 
      sendData(message); 
     JOptionPane.showMessageDialog(null,"BOOOOOOOOOOM!"); 
     } 
    } 

    else if(grid[x][y]=="2") { 
     clives--; 
     Icon phpicon = new ImageIcon(getClass().getResource("resources/"+p2hp[clives])); 
     chp.setIcon(phpicon); 
     tiles[n].setIcon(powerups);  
     tiles[n].setDisabledIcon(powerups); 
     tiles[n].setEnabled(false); 
     mines=0; 
     turn--; 
     message = "powerups"; 
     sendData(message); 
     JOptionPane.showMessageDialog(null,"Powerups -HP To Enemy!"); 
     if(turn==0){ 
      message = "win"; 
      sendData(message); 
      JOptionPane.showMessageDialog(null,"You Cleared All The Mines You Win!"); 
      System.exit(0); 
     } 
    } 

    else { 
    str=Integer.toString(mines); 
    tiles[n].setText(str); 
    UIManager.getDefaults().put("Button.disabledText",Color.BLUE); 
    tiles[n].setEnabled(false); 
    mines=0; 
    turn--; 
    if(turn==0){ 
     message = "win"; 
     sendData(message); 
     JOptionPane.showMessageDialog(null,"You Cleared All The Mines You Win!"); 
     System.exit(0); 
    } 
    } 
} 

对不起,代码可能不正确。

+2

哪个屏幕可以容纳81个Jbutton将? – kosa

+0

@Nambari我从上下文中假设这些是代表扫雷平方的小JButton。 –

+1

如何创建按钮阵列,并通过for循环添加它们,并且在每一步中都可以为特定按钮添加动作侦听器。 –

回答

1

怎么是这样的:

public void actionPerformed(ActionEvent e) { 

    for (int i = 0; i < ??; i++) { 
     if(e.getSource() == tiles[i]) { 
     n=i; 
     x=1; 
     y=i+1; 
     detectMines(); 
     setProperties(n,x,y); 
     break; 
     } 
    } 
} 

其中??被替换为您瓷砖的总数。或者按照@ brano88的建议,考虑在循环中创建按钮,而不是使用与上面显示的类似的代码。

+0

我认为我已经完成了上面的代码,但是我对结果感到不满意,感谢您的帮助。 –

4

我希望这将帮助你:

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class Minesweeper extends JFrame{ 

    JPanel panel = new JPanel(); 
    JButton [] button = new JButton[81]; 

    public Minesweeper(){ 
     panel.setLayout(new GridLayout(9,9)); 
     for(int i=0;i<81;i++){ 
      button[i] = new JButton(""+i); 
      button[i].addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        if(e.getSource() instanceof JButton) { 
          ((JButton)e.getSource()).setBackground(Color.red); 
         } 
       } 
      }); 
      panel.add(button[i]); 
     } 
     add(panel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run(){ 
       Minesweeper m = new Minesweeper(); 
       m.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       m.pack(); 
       m.setVisible(true); 
      } 
     }); 
    } 

} 

enter image description here

+0

我认为这是迄今为止最好的答案。 –

相关问题