Noniin, sain itse luotua ohjelmaani niin pitkälle, että vastaan tuli ongelma luodessani JButton taulukkoa, jonka pitäisi kuvastaa pelini pelilautaa. Nyt vain en keski, miten voin actionlistenerilläni hoitaa Pelilauta luokkaani juuri napin kohdan tässä taulukossa. Eli koodini näyttää seuraavalta:
// Alustetaan pelilaudan painikkeet jbPainikkeet = new javax.swing.JButton[pelilauta.korkeus()][pelilauta.leveys()]; for (int i = 0; i<pelilauta.korkeus();i++) { for (int j = 0; j<pelilauta.leveys();j++) { jbPainikkeet[i][j] = new Ruutu(j,i); //Lisätään tapahtumakäsittelijä jbPainikkeet[i][j].addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jbPainikkeetActionPerformed(evt); } }); jpPelilauta.add(jbPainikkeet[i][j]); } }
Tässä on taasen tuo jbPainikkeetActionPerdormed osio ja se on tyhjä, sillä en keski, miten saan luettua näppäimen kohdan taulukossa:
private void jbPainikkeetActionPerformed(java.awt.event.ActionEvent evt) { ; }
Avuksi kehitin seuraavan Ruutu luokan, joka ottaa painikkeen x ja y sijainnin taulukossa, mutta siitä ei varmaan ole apua...
public class Ruutu extends javax.swing.JButton { int leveys; int korkeus; Ruutu(int x, int y) { this.leveys = x; this.korkeus = y; } }
Tässä vielä funktio, jonka avulla lisään uuden merkinnän varsinaiseen pelilautaani, eli se on varsin yksinkertainen kutsultaan ja tarvitsee vain syötteeksi juuri hukassa olevat painikkeen sijainnin taulukossa.
public int lisaaMerkinta(int x, int y)
Eli osaan siis yksittäisen painikkeen kohdalla lisätä tämän oikeaan kohtaan, mutta mielestäni tämän pitäisi jotenkin onnistua myös taulukon avulla ja yhdellä tapahtumakäsittelijällä, sillä muuten tässä tulisi aika paljon turhaa lisäkoodia ja kopiointia. Omat taitoni eivät vain taida tämän tajuamiseen riitä
Ratkaisuja on oikeastaan kolme:
- napin haku for-silmukalla (evt.getSource() == nappi),
- nappi.setAction(String) ja evt.getActionCommand(),
- oma ActionListener, joka sisältää tiedon koordinaateista.
Ensimmäinen tapa on triviaali mutta ehdottomasti hitain ja sekavin vaihtoehto. Keskimmäisen osaat varmaan itsekin toteuttaa nyt, kun tiedät oikeat funktiot; yhdistät vain koordinaatit tekstiksi (x + "," + y) ja purat sitten tapahtumankäsittelijässä (String.split(",") ja Integer.parseInt(...)). Viimeinen onnistuu joko omalla ActionListener-implementaatiolla tai final-määreellä terästetyillä apumuuttujilla:
// Oma kuuntelija, jolle voi antaa kordinaatit. private class Kuuntelija implements ActionListener { private int x, y; public Kuuntelija(int _x, int _y) { x = _x; y = _y; } public void actionPerformed(ActionEvent evt) { // Kuuntelija välittää koordinaatit painofunktiolle. painettu(x, y, evt); } } // Apufunktio, joka luo uuden ActionListener-olion. private ActionListener uusi(final int x, final int y) { return new ActionListener() { public void actionPerformed(ActionEvent evt) { painettu(x, y, evt); } }; } // Valitse mieleisesi. jbPainikkeet[i][j].addActionListener(uusi(j, i)); jbPainikkeet[i][j].addActionListener(new Kuuntelija(j, i)); // Yllä esitetty final-kikka toteutettuna in situ eli ilman apufunktiota: for (...) { final int x = j, y = i; jbPainikkeet[i][j].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { painettu(x, y, evt); } }); }
En ota vastuuta kirjoitusvirheistä. :)
Kiitoksia tästä, saan tämän avulla viimeisteltyä ohjelmani ja opin uutta ja hyödyllistä :).
Aihe on jo aika vanha, joten et voi enää vastata siihen.