2014-03-02 3 views
0

Я пытаюсь сделать игру, как bejeweled или candycrush для домашней работы. Я хочу изменить фотографии нажатых двух кнопок. Например, я нажал buttons[5], и я нажал buttons[11]. Тогда значок buttons[5] должен быть buttons[11] значок и значок [11] должен быть buttons[5] значок. поэтому мне нужны два взаимосвязанных ActionListener. Как я могу сделать?Взаимосвязанные два ActionListener

public class butondeneme extends JFrame{ 

private JPanel grid; 
private JFrame jr; 
public String x,y; 

public butondeneme(){ 
    jr=new JFrame(); 
    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)); 

    JButton[] buttons = new JButton[64]; 


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


       String comand=Integer.toString(i); 
       final String imgName=((ImageIcon)buttons[i].getIcon()).toString(); 



       buttons[i].addActionListener(new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 


        } 


       }); 
       buttons[i].setActionCommand(comand); 

       grid.add(buttons[i]); 

      } 



    add(grid); 



} 



public static void main(String[] args){ 
    butondeneme erdem=new butondeneme(); 
    erdem.setVisible(true); 
} 



} 

ответ

3

Вы можете назначить один экземпляр ActionListener к всех кнопок, примерно так:

class ButtonActionListener extends ActionListener { 
    private JButton previousButton = null; 

    @Override 
    public void actionPerformed(ActionEvent e){ 
     JButton currentButton = (JButton)e.getSource(); 
     if (previousButton == null) { 
      previousButton = currentButton; 
      return; 
     } 

     Icon previousIcon = previousButton.getIcon(); 
     Icon currentIcon = currentButton.getIcon(); 
     currentButton.setIcon(previousIcon); 
     previousButton.setIcon(currentIcon); 
     previousButton = null; 
    } 
} 

Где создаются кнопки:

ActionListener buttonActionListener = new ButtonActionListener(); 
for (int i = 0; i<buttons.length; i++) { 
    ... 
    buttons[i] = new JButton(...); 

    buttons[i].addActionListener(buttonActionListener); 
} 

Но я бы сильно рекомендую подумать о соответствующей структуре вашей игры, которая ближе к Model-View-Controller pattern: вы должны сохранить свое состояние игры в выделенном классе, а не только в форме значков, которые они показывают. Все, что вы намеревались достичь, установив «actionCommand» кнопок, скорее всего, не будет работать должным образом, если у вас нет соответствующего представления состояния игры!

+0

большое спасибо. Я был тем, чего хотел. Однако я не понял Model-view-conroller, потому что теперь я не очень хорошо разбираюсь в java. Тем не менее, большое спасибо. – rdmzcn

Смежные вопросы