将ActionEvent添加到许多JButton

时间:2012-11-09 15:25:57

标签: java swing

我想将ActionEvent添加到81 JButton如何使用尽可能少的代码执行此操作?我已经尝试使用循环来完成工作,但我在程序本身遇到了问题。以下是我认为足以从中获得答案的代码的一部分。

    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 个答案:

答案 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

答案 1 :(得分: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的建议,考虑在循环中创建按钮,而不是使用与上面所示相似的代码。