2016-05-26 5 views
0

Ich kodiere ein Memory-Matching-Spiel mit Bildern und einem JButton-Array, aber ich habe ein Problem beim Versuch, zwei Schaltflächen, die geklickt wurden, zu vergleichen. Wie speichern Sie den Index von/erhalten Sie den Index der zweiten Schaltfläche? Alle meine Buttons im Button-Array sind mit dem gleichen actionListener verknüpft, aber e.getSource() bekommt, soweit mir bekannt ist, nur den ersten Button angeklickt. Ich würde wirklich etwas Hilfe schätzen. (Ich habe nicht in meinem ganzen Code einfügen möchten, denn das ist eine Menge, also bin ich gerade dabei in Teilen ich denke, sind relevant):Wie bekomme ich die Quelle mehrerer JButtons in Aktion Listener?

public DisplayMM(ActionListener e) 
    { 
    setLayout(new GridLayout(6, 8, 5, 5)); 
    JButton[] cards = new JButton[48]; //JButton board 

    for(int x = 0; x < 48; x++) //initial setup of board 
    { 
    cards[x] = new JButton(); 
    cards[x].addActionListener(e); 
    cards[x].setHorizontalAlignment(SwingConstants.CENTER); 
    cards[x].setPreferredSize(new Dimension(75, 95)); 
    } 

    private class e implements ActionListener 
    { 
    public void actionPerformed(ActionEvent e) 
    { 
    for(int i = 0; i < 48; i++) 
     { 
     if((e.getSource())==(cards[i]))//1st button that was clicked 
     { 
      cards[i].setIcon(new ImageIcon(this.getClass().getResource(country[i]))); 
      currentIndex = i; 
     } 
     } 
     //cards[i].compareIcons(currentIndex, secondIndex); 

    } 
} 

Auch in meinem Panel-Klasse, ich versuchte zu tun etwas ähnliches, aber es wurde schließlich in die Klasse Display verschoben, da Panel keinen Zugriff auf das Schaltflächen-Array hatte.

//Panel 

    public void actionPerformed(ActionEvent e) 
    { 
    /*every 2 button clicks it does something and decreases num of tries*/ 
     noMatchTimer = new Timer(1000, this); 
     noMatchTimer.setRepeats(false); 
     JButton source = (JButton)e.getSource(); 
     guess1 = source.getText(); //first button clicked 
     numGuess++; //keeps track of number of buttons clicked 
     JButton source2 = (JButton)e.getSource(); 
     guess2 = source2.getText(); 
     numGuess++; 
     if(numGuess == 1) 
      display.faceUp(cards, array, Integer.parseInt(e.getSource())); 
     else 
      display.compareIcons(guess1, guess2); 

     if(tries != 12 && count == 24) 
      { 
      displayWinner(); 
      } 
    } 

Antwort

1

Sie können Ihre Action Klasse private Felder geben, auch wenn es sich um eine anonyme innere Klasse ist, und eines dieser Felder kann ein Verweis auf die letzte Taste gedrückt werden. Setzen Sie ihn nach dem Drücken der zweiten Taste auf null und Sie werden immer wissen, ob der Knopf für die erste oder zweite Taste gedrückt ist.

z.B.

class ButtonListener implements ActionListener { 
    private JButton lastButtonPressed = null; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JButton source = (JButton) e.getSource(); 
     if (lastButtonPressed == null) { 
      // then this is the first button 
      lastButtonPressed = source; 
     } else { 
      // this is the 2nd button 
      if (source == lastButtonPressed) { 
       // the dufus is pushing the same button -- do nothing 
       return; 
      } else { 
       // compare source and lastButtonPressed to see if same images (icons?) 
       // if not the same, use a Timer to hold both open for a short period of time 
       // then close both 
       lastButtonPressed = null; 
      } 
     } 
    } 
} 
+0

Können Sie das näher erläutern? Wie würde ich den letzten Knopf auf Null setzen? – mk8139

+0

@ mk8139: siehe Beispiel oben –

+0

Vielen Dank, das war sehr hilfreich! – mk8139