Ringstadjr Skrevet 14. januar 2008 Skrevet 14. januar 2008 Hei Jeg holder på å lage et lite RPG-spill med JFrame. Spillet fungerer ved at man trykker på en knapp i et vindu og får opp et nytt. Disse vinduene representerer forøvrig forskjellige lokaliteter i spillet. Det jeg lurer på er hva man bør gjøre med det første vinduet når man trykker for å få opp et nytt vindu. Det gamle vinduet skal ikke vises i bakgrunnen. Til når har jeg bare satt det gamle vinduet: setVisible(false); Men det aner meg at dette ikke er en god måte å gjøre det på. Det jeg antar at da vil skje er at det vil hope seg opp med usynlige vinduer. Hvis dette stemmer så tar jeg gjerne i mot tips om hvordan en bør gjøre det.
pgdx Skrevet 14. januar 2008 Skrevet 14. januar 2008 Hva med å drepe JFrame-en? Har du ikke bruk for den, er det jo bare til å avslutte den.
Ringstadjr Skrevet 15. januar 2008 Forfatter Skrevet 15. januar 2008 Det hørtes lurt ut. Du skjønner jeg er nybegynner i faget så jeg lurte på om du kunne foreslå en metode for å drepe den på en skikkelig måte. Vil ikke ha noen dødskramper en gang
emva Skrevet 15. januar 2008 Skrevet 15. januar 2008 se på setDefaultCloseOperation i javax.swing.JFrame DISPOSE_ON_CLOSE skulle være fin for det bruket. bruksmåte: fjernJFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
Cyberfrog Skrevet 15. januar 2008 Skrevet 15. januar 2008 Skal man eksplisitt "drepe" en JFrame og har et objekt, her kalt "jframe", kan man bruke jframe.dispose(); eller hvis JFrame er superklasse, rett og slett bare dispose(); Forøvrig er JFrame en "container". Dvs. at innholdet kan byttes ut, hvis dette skulle være mer ønskelig enn å kontinuerlig kvitte seg med en JFrame for så og opprette en annen...
Gjest Slettet+1374861 Skrevet 17. januar 2008 Skrevet 17. januar 2008 Forøvrig er JFrame en "container". Dvs. at innholdet kan byttes ut, hvis dette skulle være mer ønskelig enn å kontinuerlig kvitte seg med en JFrame for så og opprette en annen... True. Høres travelt ut å hele tiden få en ny JFrame, hvis så ikke er nødvendig (som det ikke høres ut siden foregående frame til en hver tid skal fjernes.
v3g4rd Skrevet 17. januar 2008 Skrevet 17. januar 2008 Blir det ikke lettere å dele opp lokasjonene ved hjelp av JPanel, i stedet for å lage en helt ny JFrame for hver gang?
Ringstadjr Skrevet 29. januar 2008 Forfatter Skrevet 29. januar 2008 (endret) Takk for svar! Jeg valgte fremgangsmåten med å drepe JFramen for hver gang og så opprette en ny, rett og slett fordi jeg ikke vet hvordan jeg skal bytte ut innholdet i den for hver gang. Er ikke noen erfaren Java-programmerer. Uansett har jeg nå et nytt problem. Jeg har laget programmet slik at når jeg trykker på en knapp i en lokalitet(et vindu) så er det en actionlistener i et eksternt object som åpner et nytt object(ny lokalitet) og avslutter den gamle. Problemet er å avslutte den gamle. Har prøv denne kodesnutten: else if(h.getActionCommand().equals("Ny lokalitet")) { nyLok = new NyLokalitet(this); h.getSource().dispose(); } Jeg tror jeg ser hvorfor problemet oppstår. "dispose()" er vel en metode i et ikke opprettet object. Men jeg har ingen andre forslag til hvordan jeg skal gjøre det. Det er meningen at kodesnutten skal brukes for alle objecter som sender "Ny lokalitet" som ActionCommand. Håper jeg har skrevet forståelig nok Endret 29. januar 2008 av Ringstadjr
Gjest Slettet+1374861 Skrevet 29. januar 2008 Skrevet 29. januar 2008 (endret) Jeg har laget programmet slik at når jeg trykker på en knapp i en lokalitet(et vindu) så er det en actionlistener i et eksternt object som åpner et nytt object(ny lokalitet) og avslutter den gamle. Problemet er å avslutte den gamle. Kan ikke instansiere det "eksterne objectet" (hva nå enn det er for no) med det gamle vinduet som parameter, evt sette den? edit: Ser jo faktisk ut osm du har gjort noe lignende når du oppretter "new Lokalitet(this)"...? *håpe jeg forsto problemet* Tror du bør revurdere din bruk av ordet "object" Endret 29. januar 2008 av Slettet+1374861
Ringstadjr Skrevet 29. januar 2008 Forfatter Skrevet 29. januar 2008 Hm... Ser jeg har uttrykt meg uklart. Det er snakk om tre objecter her(eller klasser, hvis det var noe bedre. Vet ikke noe bedre ord enn det.) To av disse objectene er vinduer(et vindu = en lokalitet i spillet). Object 1 = gammelt vindu. Inneholder knapp for å gå til nytt vindu. Object 2 = nytt vindu Object 3 = "eksternt object"(utrolig dårlig navn på det, men for å illustrere at dette ikke er et vindu) Object 3 har en ActionListener som registrerer trykk på knappen i Object 1. Altså denne kodesnutten else if(h.getActionCommand().equals("NyttVindu")) { nyLok = new NyttVindu(this); h.getSource().dispose(); // Her vil jeg at gammeltvindu skal lukkes } Håper at jeg gjorde meg forstått bedre denne gangen viCtim: Takk for svar. Tror ikke du skjønte helt hva jeg ville fram til. I så fall får du unnskylde meg da jeg ikke forstod hvordan du mente løsningen kunne være.
Gjest Slettet+1374861 Skrevet 30. januar 2008 Skrevet 30. januar 2008 (endret) if(h.getActionCommand().equals("NyttVindu")) { // ... Fjerne gammelt vindu Component kilde = (Component)h.getSource(); while(kilde.getParent() != null) kilde = kilde.getParent(); if(kilde instanceof JFrame) ((JFrame)kilde).dispose(); // ... Lage nytt vindu new JFrame().setVisible(true); } Hvor optimalt dette er er vel derimot ikke spesielt lystig å prate om... Det finnes ingen garanti for at den øverste Componenten du kommer til (den som ikke lenger har en Parent) er en JFrame. I utgangspunktet vet jeg heller ikke her om h.getSource() er en Component. Du kunne også kanskje gjort det slik som dette.... public class Ekstern implements ActionListener { public static void main(String[] args) { JFrame objekt1 = new JFrame(); objekt1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); objekt1.setSize(150,30); JButton knapp = new JButton("Knapp"); objekt1.add(knapp); Ekstern objekt3 = new Ekstern(objekt1); knapp.addActionListener(objekt3); objekt1.setVisible(true); objekt1.pack(); } private JFrame gammeltVindu; public Ekstern(JFrame gammeltVindu) { this.gammeltVindu = gammeltVindu; } public void actionPerformed(ActionEvent e) { gammeltVindu.dispose(); JFrame objekt2 = new JFrame(); objekt2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); objekt2.setVisible(true); objekt2.pack(); } } Men da bør du flytte oppretting av nytt vindu til en annen plass (egen metode i Ekstern?). Eventuelt kan du også opprette knappen med kunnskap om hvilken JFrame den hører til og dermed la den stå for å dispose'e (en extension av JButton med egne Constructorer og metoder for dette). Blabla... Som sagt. Ikke mye optimalt, men må innrømme jeg ikke synes det er mye optimalt å måtte lage en ny JFrame hvor hver gang man beveger seg i ett spill også Endret 30. januar 2008 av Slettet+1374861
Ringstadjr Skrevet 30. januar 2008 Forfatter Skrevet 30. januar 2008 Takk for løsningen! Jeg gikk for den første kodesnutten. Det var akkurat noe sånt jeg var på utkikk etter. Nå funker alt som det skal, selv om det helt sikkert ikke er optimalt. Det er likevel godt nok for mitt bruk som nybegynner og første større program(sett fra mitt ståsted). Igjen takk
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå