Gå til innhold

Spill med JFrame - lukking av vinduer


Anbefalte innlegg

Skrevet

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.

Videoannonse
Annonse
Skrevet

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

Skrevet

se på setDefaultCloseOperation i javax.swing.JFrame

DISPOSE_ON_CLOSE skulle være fin for det bruket.

 

bruksmåte: fjernJFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

Skrevet

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
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.

  • 2 uker senere...
Skrevet (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 av Ringstadjr
Gjest Slettet+1374861
Skrevet (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 av Slettet+1374861
Skrevet

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 (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å :p

Endret av Slettet+1374861
Skrevet

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...