2 JFramea, miten muutan muuttujaa?

Jahvariini

Hei!

Olen aloittelija javassa, ja yritän tehdä swing-pohjaista ohjelmaa, jossa on 2 Framea. Ohjelman käynnistyessä käynnistyy toinen frameista, jossa on JLabel jlabel1 ja nappula JButton1. Kun JButton1-nappia painetaan, aukeaa toinen frame (Formi2), jossa on yksi nappula (JButton1).

Tähän asti kaikki on ok. Mutta haluan ohjelman toimivan siten, että kun painan Formi2:n nappulaa JButton1, pitäisi ensimmäisen JFramen jLabel1:n tekstin muuttua vaikkapa tekstiksi "nappia painettu".

Eli miten saan "accessin" Formi-luokan muuttujaan jLabel1:een Formi2-luokan kautta? Tämä on ihan perustavaa laatua oleva kysymys, johon en ole runsaasta etsimisestä huolimatta löytänyt vastausta. Ilmeisesti pitäisi käyttää perintää tms., mutta en luonnollisesti halua Formi2-luokan perivän Formi-luokan muita komponentteja kuin jLabel1:n. Olenko ihan hakoteillä? Miten saan accessin Formi-luokan jLabeliin Formi2-luokasta?

Kiitos etukäteen!

Jahvariini

public class Formi extends javax.swing.JFrame {

/** Creates new form Formi */
public Formi() {
initComponents();
}
private void initComponents() {//GEN-BEGIN:initComponents
jLabel1 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();

addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});

jLabel1.setText("T�m�n haluan muuttaa");
getContentPane().add(jLabel1, java.awt.BorderLayout.CENTER);

jButton1.setText("jButton1");
jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton1MouseClicked(evt);
}
});

getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);

pack();
}//GEN-END:initComponents

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton1MouseClicked
   Formi2 form2 = new Formi2();
   form2.setVisible(true);
// TODO add your handling code here:
}//GEN-LAST:event_jButton1MouseClicked

/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
System.exit(0);
}//GEN-LAST:event_exitForm

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new Formi().show();
}

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
// End of variables declaration//GEN-END:variables

}

public class Formi2 extends javax.swing.JFrame {

/** Creates new form Formi2 */
public Formi2() {
initComponents();
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
jButton1 = new javax.swing.JButton();

addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});

jButton1.setText("jButton1");
jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton1MouseClicked(evt);
}
});

getContentPane().add(jButton1, java.awt.BorderLayout.CENTER);

pack();
}//GEN-END:initComponents

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton1MouseClicked

// TODO add your handling code here:
}//GEN-LAST:event_jButton1MouseClicked

/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
System.exit(0);
}//GEN-LAST:event_exitForm

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new Formi2().show();
}

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
// End of variables declaration//GEN-END:variables

}

7

309

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • zustus

      Tee form kakkoseen konstruktori jolle voit antaa parametriksi ykkösformin nappulan. Sen jälkeen voit käsitellä tuota nappulaa myös kakkosformissa ilman että käytät staattisia muuttujia. ;)

      Kannattaa siis paneutua vähän edes olio-ohjelmoinnin alkeisiin ennen kuin alkaa vääntämään jollain IDE:llä hienoa ohjelmaa jonka perusperiaatteista ei tiedä mitään.. Kannattanee varmaan sen jälkeen miettiä että pitäisköhän noita valmiiksi tulleita muuttujien nimiä vaihtaa vähän selkeämpään suuntaan.

      public class Formi2 extends javax.swing.JFrame {
      private JButton nappi;
      /** Formi2:n konstruktori */
      public Formi2(JButton parametri) {
      this.nappi = parametri;
      }

      formi2 nappia painettu ->
      nappi.setText("Nappia painettu");

      }

      Ja ekassa formissa teet kakkosluokasta olion kutsumalla tuota ylempänä olevaa konstruktoria näin;
      Formi2 uusiIkkuna = new Formi2(jButton1);

      • Jahvariini

        Hienoa, kiitos!

        Joo, olio-ohjelmoinnin alkeet on kyllä meikäläisellä aika hakusessa. Mulla on parikin kirjaa missä näitä asioita selitetään, mutta jotenkin on aika vaikeaa löytää niistä ne oleelliset asiat.

        Mutta tästä on hyvä lähteä liikkeelle. Kiitos loistavasta esimerkistä!!

        Jahvariini


      • ehkapa

        Hmm.. Tuo toisen framen nappulan antaminen konstruktorissa pisti vahan silmaan...

        Lueppa lyhyesti vaikka model-view-control arkkitehtuurista. Ala laita frameja toisistaan tietoisiksi (kuten ohjattiin) vaan ne esitellaan jossain keskeisessa luokassa jonka kauttaa ne paasevat toisiinsa kasiksi.

        Ja .. "nappuloita" ei sinallaan kukaan tarvitse, vaan sita tehtavaa jonka ne toteuttavat. Eli, ala missaan tapauksessa laita sinne mitaan funktioita setButtonAText() vaan se tapahtuma mika on oikeasti tapahtunut.

        Esimerkki.
        Frame A:ssa nappula "Kaynnista hoyrymoottori". Frame B:ssa nappula "Kaynnista ihmeSysteemi". Kun ihmeSysteemi kaynnistyy, kaynnistyy myos hoyrymoottori. Taten Frame a:sta ei voi enaa kaynistaa sita vaan sen voi vaan sammuttaa. Nappulan teksti pitaa siis vaihtaa. Nyt sina toteutat Frameen A metodin "public void hoyryMoottoriKaynnistetty()". Tama metodi sitten vaihtaa nappulan nimeksi "Sammuta hoyrymoottori".

        Jos nyt kysyt miksi nain vaikea juttu .. niin vastaus on seuraava: Voi olla etta tulevaisuudessa haluat tehda jotain muuta kuin vaihtaa sita nappulan tekstia. Jos olet tehnyt kuten jalkimmaisessa esimerkissa sanotaan, sinun ei tarvitse koskea lainkaan Frame B:hen.

        Ok, nyt takaisin hommiin. Tsemppia sulle.


      • zustus
        ehkapa kirjoitti:

        Hmm.. Tuo toisen framen nappulan antaminen konstruktorissa pisti vahan silmaan...

        Lueppa lyhyesti vaikka model-view-control arkkitehtuurista. Ala laita frameja toisistaan tietoisiksi (kuten ohjattiin) vaan ne esitellaan jossain keskeisessa luokassa jonka kauttaa ne paasevat toisiinsa kasiksi.

        Ja .. "nappuloita" ei sinallaan kukaan tarvitse, vaan sita tehtavaa jonka ne toteuttavat. Eli, ala missaan tapauksessa laita sinne mitaan funktioita setButtonAText() vaan se tapahtuma mika on oikeasti tapahtunut.

        Esimerkki.
        Frame A:ssa nappula "Kaynnista hoyrymoottori". Frame B:ssa nappula "Kaynnista ihmeSysteemi". Kun ihmeSysteemi kaynnistyy, kaynnistyy myos hoyrymoottori. Taten Frame a:sta ei voi enaa kaynistaa sita vaan sen voi vaan sammuttaa. Nappulan teksti pitaa siis vaihtaa. Nyt sina toteutat Frameen A metodin "public void hoyryMoottoriKaynnistetty()". Tama metodi sitten vaihtaa nappulan nimeksi "Sammuta hoyrymoottori".

        Jos nyt kysyt miksi nain vaikea juttu .. niin vastaus on seuraava: Voi olla etta tulevaisuudessa haluat tehda jotain muuta kuin vaihtaa sita nappulan tekstia. Jos olet tehnyt kuten jalkimmaisessa esimerkissa sanotaan, sinun ei tarvitse koskea lainkaan Frame B:hen.

        Ok, nyt takaisin hommiin. Tsemppia sulle.

        Ihan totta puhut. Mutta edelleen kannattaa varmaan ottaa ensin tosiaan selville vähän enemmän luokista, niiden rakenteista ja rakentamisesta ennen kuin alkaa miettiä hienompia arkkitehtuuriratkaisuja..

        Mun mielipide on muutenkin, että heitä se IDE pois siks aikaa kun ensin teet ihan komentorivikehoitteella toimivia "Hoi maailma" sovelluksia. Tuntuu ehkä tylsältä mutta taitaa olla ainoa keino jolla oikeasti opit mitä siellä alla tapahtuu.


      • Jahvariini
        ehkapa kirjoitti:

        Hmm.. Tuo toisen framen nappulan antaminen konstruktorissa pisti vahan silmaan...

        Lueppa lyhyesti vaikka model-view-control arkkitehtuurista. Ala laita frameja toisistaan tietoisiksi (kuten ohjattiin) vaan ne esitellaan jossain keskeisessa luokassa jonka kauttaa ne paasevat toisiinsa kasiksi.

        Ja .. "nappuloita" ei sinallaan kukaan tarvitse, vaan sita tehtavaa jonka ne toteuttavat. Eli, ala missaan tapauksessa laita sinne mitaan funktioita setButtonAText() vaan se tapahtuma mika on oikeasti tapahtunut.

        Esimerkki.
        Frame A:ssa nappula "Kaynnista hoyrymoottori". Frame B:ssa nappula "Kaynnista ihmeSysteemi". Kun ihmeSysteemi kaynnistyy, kaynnistyy myos hoyrymoottori. Taten Frame a:sta ei voi enaa kaynistaa sita vaan sen voi vaan sammuttaa. Nappulan teksti pitaa siis vaihtaa. Nyt sina toteutat Frameen A metodin "public void hoyryMoottoriKaynnistetty()". Tama metodi sitten vaihtaa nappulan nimeksi "Sammuta hoyrymoottori".

        Jos nyt kysyt miksi nain vaikea juttu .. niin vastaus on seuraava: Voi olla etta tulevaisuudessa haluat tehda jotain muuta kuin vaihtaa sita nappulan tekstia. Jos olet tehnyt kuten jalkimmaisessa esimerkissa sanotaan, sinun ei tarvitse koskea lainkaan Frame B:hen.

        Ok, nyt takaisin hommiin. Tsemppia sulle.

        "Nyt sina toteutat Frameen A metodin "public void hoyryMoottoriKaynnistetty()".

        Tämä oli mulla just se ongelma. Miten pystyn suorittamaan Frame A:n metodin Frame B:stä? Pitääkö Frame B:n periä Frame A:n metodit vai pitääkö Frame A:n metodin olla staattinen tms?

        Sain kyllä tuon nappulajutun toimimaan zustuksen ohjeen mukaan, mutta noin yleisemmällä tasolla kiinnostaisi, miten toisesta luokasta saadaan "siististi" access toiseen luokkaan.

        Olen käyttänyt rumasti staattisia muuttujia sekä package-keywordia, mutta ilmeisesti on tarjolla myös muita, ammattimaisempia keinoja.


      • nain
        Jahvariini kirjoitti:

        "Nyt sina toteutat Frameen A metodin "public void hoyryMoottoriKaynnistetty()".

        Tämä oli mulla just se ongelma. Miten pystyn suorittamaan Frame A:n metodin Frame B:stä? Pitääkö Frame B:n periä Frame A:n metodit vai pitääkö Frame A:n metodin olla staattinen tms?

        Sain kyllä tuon nappulajutun toimimaan zustuksen ohjeen mukaan, mutta noin yleisemmällä tasolla kiinnostaisi, miten toisesta luokasta saadaan "siististi" access toiseen luokkaan.

        Olen käyttänyt rumasti staattisia muuttujia sekä package-keywordia, mutta ilmeisesti on tarjolla myös muita, ammattimaisempia keinoja.

        Eli teet juuri niinkuin edellinen kirjoittaja neuvoi mutta laitatkin sinne konstruktoriin sen 'keskeisen' luokan referenssin etka sita toista framea suoraan.

        Laitetaan vaikka yksinkertaisesti nain ...
        Sulla on luokka PaaLuokka.

        public FrameA = null;
        public FrameB = null;

        Siella sitten on:
        FrameA frameA = new FrameA(this);
        FrameA frameB = new FrameB(this);

        luokka FrameA:
        private PaaLuokka parent = null;

        void FrameA(PaaLuokka parent) {
        this.parent = parent;
        }

        Sama tehdaan FrameB:lle.

        Sen jalkeen voit kutsua FrameA:sta FrameB:n funktiota teeKikka() nain:
        parent.frameB.teeKikka();

        Tama nyt oli yksinkertaistettu esimerkki. Ei ole niin kaunista jattaa noita PaaLuokan frameja 'public':ksi mutta nain aluksi helpoin tapa.

        Toivottavasti esimerkki auttoi..


      • Jahvariini
        nain kirjoitti:

        Eli teet juuri niinkuin edellinen kirjoittaja neuvoi mutta laitatkin sinne konstruktoriin sen 'keskeisen' luokan referenssin etka sita toista framea suoraan.

        Laitetaan vaikka yksinkertaisesti nain ...
        Sulla on luokka PaaLuokka.

        public FrameA = null;
        public FrameB = null;

        Siella sitten on:
        FrameA frameA = new FrameA(this);
        FrameA frameB = new FrameB(this);

        luokka FrameA:
        private PaaLuokka parent = null;

        void FrameA(PaaLuokka parent) {
        this.parent = parent;
        }

        Sama tehdaan FrameB:lle.

        Sen jalkeen voit kutsua FrameA:sta FrameB:n funktiota teeKikka() nain:
        parent.frameB.teeKikka();

        Tama nyt oli yksinkertaistettu esimerkki. Ei ole niin kaunista jattaa noita PaaLuokan frameja 'public':ksi mutta nain aluksi helpoin tapa.

        Toivottavasti esimerkki auttoi..

        A-haa, noinkin voi tehdä. Vaikuttaa aika selkeältä. Täytyypä koettaa heti maanantaina töihin päästyäni.

        Kiitos tuhannesti ohjeista!!

        Jahvariini


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Putin hoiti Suomen natoon ja myös Ruotsin

      Iso kiitos Vladimir Putinille. Hänen ansiosta pääsemme nyt Natoon. Putin halusi Naton lähelle ja nyt sai. Voimme tästä kiittää vain Putinia.
      Maailman menoa
      643
      7896
    2. Niinistö teki hetkessä Suomesta Venäjän ydinaseiden maalitaulun

      Kaiken lisäksi mies vielä lällätteli Putinille eilisessä tiedotustilaisuudessa ja käski katsomaan itseään peiliin. Kyllä vähän asiallisempaa käytöstä
      Maailman menoa
      448
      2170
    3. Voi Stefu ja sun kiivas luonteesi

      Sielä lentelee ullakkohuoneiston ikkunasta daamin vaatteet ja matkalaukut pitkin pihaa. Toisaalta,en ihmettele yhtään että tämä suhde päättyi näin,kyl
      Kotimaiset julkkisjuorut
      227
      2082
    4. Poliisi otti Stefun kiinni!

      Seiska tietää kertoa.
      Kotimaiset julkkisjuorut
      143
      1658
    5. Veikkaus: Miten The Rasmus pärjää Euroviisuissa?

      Euroviisuhuuma on ylimmillään, kun Suomi ja The Rasmus taistelee biisillään Jezebel. Bändi on tikissä, kunhan Lauri Ylösen ääni kantaa. Mitä veikka
      Viihde ja kulttuuri
      51
      1221
    6. Ohhoh! Martina Aitolehti ja seurapiirihurmuri-Jesper ekassa yhteiskuvassa - Sutinaa Mallorcalla!

      Martina Aitolehti ja seurapiirijulkkis-Jesper nauttivat toisistaan varsin vauhdikkaissa merkeissä Mallorcalla. Aitolehti ei ole esitellyt rakastaan vi
      Kotimaiset julkkisjuorut
      25
      1197
    7. Stefanilta tuli taas karu totuus Sofiasta

      Marokkolainen h*o*ra! Voi tsiisus kun mulla on hauskaa! Lumput lentää ikkunasta kun Stefu raivoaa h*uralleen🤣🤣🤣 Nyt ne popparit tulille, tästä tule
      Kotimaiset julkkisjuorut
      95
      1067
    8. Ootko onnellinen kun ei tarvitse

      nähdä tätä tyhmää naamaa enää koskaan? Multa se särkee sydämen, mutta minkäs teen. Vaikka olisi kuinka sinnikäs eikä hellittäisi, se ei aina auta.
      Ikävä
      65
      828
    9. Oletko nähnyt eroottiset kohuleffat? Fifty Shades Of Grey -trilogia tv:stä

      Fifty Shades -trilogia starttaa, kun nuori opiskelijanainen Anastasia tapaa rikkaan liikemiehen. Seksisuhdehan siitä starttaa, höystettynä sadistisill
      Suhteet
      6
      712
    10. Steppuli veressä

      Seiskan lööpissä Steppulilla naama ja nyrkit veressä. Ei tainnut ihan kamojen pihalle paiskominen riittää. Onkohan pistänyt kämpän tuusannuuskaks.
      Kotimaiset julkkisjuorut
      54
      710
    Aihe