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
}
2 JFramea, miten muutan muuttujaa?
7
309
Vastaukset
- 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
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.6437896Niinistö 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ä4482170Voi 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,kyl2272082- 1431658
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ä veikka511221Ohhoh! 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 vi251197Stefanilta 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ä tule951067Ootko 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.65828Oletko 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ä sadistisill6712Steppuli veressä
Seiskan lööpissä Steppulilla naama ja nyrkit veressä. Ei tainnut ihan kamojen pihalle paiskominen riittää. Onkohan pistänyt kämpän tuusannuuskaks.54710