Java Hoofd klasse aanroepen

Status
Niet open voor verdere reacties.

chimaera

Gebruiker
Lid geworden
22 mrt 2009
Berichten
8
Hallo,
Ik heb op school Java, maar het gaat soms een beetje te langzaam, dus ik was thuis ook lekker bezig, maar nu heb ik een vraag.
Stel ik heb een JFrame en ik zet daar een JPanel in.
Is het dan mogenlijk om met me JPanel mijn JFrame aan te spreken?

Bijvoorbeeld ik wil met een button in mijn JPanel mijn title van me JFrame aanpassen.
Dit heb ik nu:

<Main class word aangroepen bij starten>

package pack;

import javax.swing.*;

public class Main extends JFrame{

/**
* @param args
*/
public static void main(String[] args) {
//JFrame bouwen
JFrame frame = new Main();
frame.setSize( 400, 200 );
frame.setTitle( "Test" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
frame.setContentPane( new Paneel() );
frame.setVisible( true );
}
}

<Paneel classe>
package pack;
import java.awt.event.*;
import javax.swing.*;

public class Paneel extends JPanel {
JButton knop;

public Paneel(){
knop = new JButton("Klik");
knop.addActionListener( new Knophandler() );
add(knop);
}

public class Knophandler implements ActionListener{

public void actionPerformed(ActionEvent e){
if(e.getSource() == knop){
//Hier wil ik dus me title veranderen

}
}

}
}

Kan iemand me helpen. Zo wil ik bijvoorbeeld ook proberen om de SetContentPlane te veranderen in een ander Paneel? is dat bijvoorbeeld ook mogelijk. Dat als ik op een knop druk een ander JPanel word gebruikt? (en deze dus weg gaat).


Als het onduidelijk is hoor ik het graag

Chimaera
 
Oké, je Main kent Paneel, maar Paneel kent Main niet, en die moet je dus meegeven bij zijn constructie dus ipv new Paneel() doe je new Paneel(this). Uiteraard moet je ook de constructor van Paneel wijzigen om een JFrame mee te krijgen en die JFrame gelijkstellen aan een JFrame in Paneel. Dan kun je -waar je je code reeds voorzien hebt- zeggen:

jframeInJePaneel.setTitle("jouw String");
 
Ok ik heb je voor een gedeelte kunnen volgen. :)

Ik heb nu het volgende:
Main.java

package pack;



public class Main{

/**
* @param args
*/
public static void main(String[] args) {
Frame frame = new Frame();
}
}


Frame.java

package pack;

import javax.swing.*;

public class Frame extends JFrame{
JFrame frame;
public Frame(){
//JFrame bouwen
frame = new JFrame();
frame.setSize( 400, 200 );
frame.setTitle( "Test" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setContentPane( new Paneel(this) );
frame.setVisible( true );
}

}

Paneel.java

package pack;
import java.awt.event.*;
import javax.swing.*;

public class Paneel extends JPanel {
JButton knop;
JFrame HoofdFrame;
public Paneel(JFrame thisFrame){
knop = new JButton("Klik");
knop.addActionListener( new Knophandler() );
add(knop);
HoofdFrame = thisFrame;


}

public class Knophandler implements ActionListener{


public void actionPerformed(ActionEvent e){
if(e.getSource() == knop){
HoofdFrame.setTitle("test");
System.out.println("t");

}
}

}
}


-----
Ik heb Main en daarin de JFrame gesplitst omdat hij anders zat te zeuren dan Main static is...

Nu wijzigt hij hem denk ik, maar hij laat hem nog niet zien, omdat hij nog niet gekoppeld is.. Hoe doe ik dat? Ben nog een noob in java.

Alvast bedankt voor het bericht
 
Zo werkt het wel:

Ik hoop wel dat je het niet klakkeloos overneemt, maar dat je er ook voor zorgt dat je het begrijpt!

klasse Main:

Code:
public class Main{

/**
* @param args
*/
public static void main(String[] args) {
MyFrame frame = new MyFrame();
}
}

klasse Paneel:
Code:
import javax.swing.*;
import java.awt.event.*;
import javax.swing.*;

public class Paneel extends JPanel {

private JFrame hoofdFrame;
private JButton knop;

public Paneel(JFrame thisFrame){
hoofdFrame = thisFrame;
knop = new JButton("Klik");
knop.addActionListener( new Knophandler() );
add(knop);


}

public class Knophandler implements ActionListener{


public void actionPerformed(ActionEvent e){
if(e.getSource() == knop){
hoofdFrame.setTitle("je nieuwe titel!");
System.out.println("nieuw titel!");
}}
}
}

klasse MyFrame (heb ik hernoemd, Frame vond ik nogal verwarrend)
Code:
import javax.swing.*;

public class MyFrame extends JFrame{

public MyFrame(){
//JFrame bouwen
this.setSize(400, 200);
this.setTitle( "Test" );
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
this.setContentPane( new Paneel(this) );
this.setVisible( true );
}

}

En nog een kleine opmerking: Klassen schrijf je met een hoofdletter maar variabelen niet. Probeer echt te vermijden om variabelen met een hoofdletter te schrijven. Dit is nogal verwarrend.

Met vriendelijke groet

Trance
 
Laatst bewerkt:
Ik heb het idd even gekopieerd om te kijken of het klopte. En dat is inderdaad wat ik wilde.

Mag ik een gok doen wat je gedaan hebt en waarom?

Ik zie dat je this. hebt gebruikt. Dit betekent dat MyFrame al die eigenschappen bezit toch? Dus als je dan this mee geeft werkt het wel... Ik heb namelijk een object gebruikt vandaar dat hij niet werkte?

Of was het iets anders.. (Wil het idd allemaal graag weten, anders leer ik er idd niets van en dat wil ik juist wel).
 
Je maakt in je main een object van Frame, maar de klasse frame zelf maakte je dan nog eens een object ervan! Dat is waar het fout liep. De klasse frame is een extentie van JFrame, dus als je van die klasse een object maakt, maak je dus eigenlijk een object van JFrame en hoef je dat in die klasse zelf niet meer te doen. 'this' gebruik ik omdat Frame een extentie is van JFrame en het object zelf (=this), daar pas je de dingen op toe.

Ik hoop dat ik het klaar en duidelijk uitgelegd heb.

Als je het snapt zet je vraag dan ook even op "vraag opgelost", als je nog meer vragen hebt, moet je het maar vragen. Ik zal ze met veel plezier (proberen) te beantwoorden.


grts
 
JPanel heeft ook een functie getParent().. Hiermee krijg je het Component dat deze JPanel bevat...
Als je maar vaak genoeg getParent() aan roep krijg je uiteindelijk het JFrame waarin je je panel hebt gezet.

Met deze functie kan je Frame krijgen van elke JPanel/component (of null als deze niet bestaat)

Code:
public static Frame getParentFrame(Component c) {
		while (c != null && !(c instanceof Frame)) {
			getParentFrame(c.getParent());
		}
		return (Frame) c;
}
 
Bedankt voor alles. En als ik een vraag heb zal ik hem nog eens posten.

De vraag is opgelost :)

Succes
Chimaera
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan