Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: JButton taulukko ja toiminta

Daih [30.03.2010 21:20:05]

#

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ä

Metabolix [30.03.2010 21:41:49]

#

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ä. :)

Daih [30.03.2010 22:17:15]

#

Kiitoksia tästä, saan tämän avulla viimeisteltyä ohjelmani ja opin uutta ja hyödyllistä :).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta