2017-07-15 7 views
1

Ich versuche gerade, ein Tic Tac Toe GUI Raster mit 3x3 Tasten zu erstellen, die das Schaltflächensymbol auf Null oder Kreuz setzen, wenn Sie gedrückt werden.Java: Objektreferenz während der Methode

Ich habe ein Array von JButtons eingerichtet und einen Listener hinzugefügt, um zu überprüfen, wann immer die Taste gedrückt wird.

Mein Problem ist Zugriff auf das Button-Objekt innerhalb des Arrays, ich musste einen Parameter zu meinem benutzerdefinierten Listener-Konstruktor hinzufügen, um die Schaltfläche Objekt Referenz für zu speichern, wenn ich es ändern möchte. Es funktioniert wie es ist, fühlt sich aber nicht sehr elegant an. Gibt es eine Möglichkeit, innerhalb von actionPerformed das richtige JButton-Objekt in Schaltflächen zu finden, oder gibt es eine bessere Möglichkeit, dies alles zu tun?

Vielen Dank im Voraus

class BigPanel 
{ 
    public JPanel bigPanel= new JPanel(new GridLayout(3,3)); 
    public JButton[][] buttons = new JButton[3][3]; 

    public BigPanel() 
    { 
     for (int i=0; i<3; i++) 
     { 
      for (int j=0; j<3; j++) 
      { 
       buttons[i][j] = new JButton(); 
       buttons[i][j].setPreferredSize(new Dimension(75,75)); 

       // Line of interest, adding the listener 
       buttons[i][j].addActionListener(new CustomActionListener(buttons[i][j])); 

       bigPanel.add(buttons[i][j]); 
      } 
     } 
    } 
} 

class CustomActionListener implements ActionListener 
{ 
    public int a; 
    public int b; 
    public JButton button; 

    CustomActionListener(JButton a) 
    { 
     button = a; 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     changeButton(a, b, CurrPlayer.CROSSES); 
    } 

    public void changeButton(int a, int b, CurrPlayer player) 
    { 
     if (player == CurrPlayer.NOUGHTS) 
     { 
      Icon icon = new ImageIcon("Nought.jpg"); 
      button.setIcon(icon); 
     } 
     else 
     { 
      Icon icon = new ImageIcon("Cross.jpg"); 
      button.setIcon(icon); 
     } 
    } 
} 
+0

Ich sehe nicht, wie Ihr Zuhörer überhaupt arbeiten wird. Die x- und y-Koordinaten der Schaltfläche werden nie festgelegt. –

+0

Es tut mir leid, ich verstehe nicht, was du meinst, kannst du es erklären? Ich habe es geschafft, den Zuhörer dazu zu bringen, das Button-Image zu ändern, wann immer es so weit geschoben wird. –

Antwort

0

ändern CustomActionListener zu folgenden wird dieses Problem lösen

class CustomActionListener implements ActionListener { 
    public int a; 
    public int b; 

    CustomActionListener() 
    { 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     JButton button = (JButton) e.getSource(); 
     changeButton(a, b, CurrPlayer.CROSSES, button); 
    } 

    public void changeButton(int a, int b, CurrPlayer player, JButton button) 
    { 
     if (player == CurrPlayer.NOUGHTS) 
     { 
      Icon icon = new ImageIcon("Nought.jpg"); 
      button.setIcon(icon); 
     } 
     else 
     { 
      Icon icon = new ImageIcon("Cross.jpg"); 
      button.setIcon(icon); 
     } 
    } 
} 

Sie JButton Referenz verwendet actionEvent.getSource() Methode erhalten kann.

Und fügen Aktion Hörer Tasten wie unten

buttons[i][j].addActionListener(new CustomActionListener()); 

Hope this helfen Ihnen.

+0

Danke, das war genau das, was ich gesucht habe –

+0

Es hat funktioniert ?????? – ELITE

+0

Ja, es hat perfekt funktioniert, aber jetzt muss ich herausfinden, wie ich auf das BigPanel zugreifen kann, um das Bild zu ändern, sobald die Zelle gewonnen wurde. –

Verwandte Themen