Zum Inhalt springen

GUI Problem


Adrian_S

Empfohlene Beiträge

Hallo !

Zur Übung wollte ich ein kleines Programm schreiben mit einer Benutzeroberfläche .... bis ich auf folgendes Problem stieß:

Ich erzeuge in meiner main ein JFrame und in diesem JFrame habe ich ein Container in dem ein Panel sitzt. so weit so gut ....

nun hab ich noch ein JMenuBar mit einem JMenu in dem 2 JRadioMenuItems gruppiert sind. Wenn ich nun eins der JRadioMenuItems aktiviere soll ein anderes Panel in den Container rein.

Ich glaube das mein Problem jetzt hoffentlich klar ist ... da das alles im Konstruktor passiert ändert sich das Panel während der Laufzeit nicht. kann sein das ich da irgendwas nicht verstehe.

Wenn eins der JRadioMenuItems aktiviert ist durch .isSelected(true) funktionierts. habe es schon mit Actionlistenern probiert aber das haut auch nicht hin. Ich brauche irgendeine Methode die das komplette Fenster schließt und neustart damit die komplette Oberfläche neufgebaut wird und zwar abhängig vom selektierten JRadioMenuItem.

Es sei denn ihr habt nen besseren vorschlag wie man sowas machen kann.

JFrame Konstruktor:

CounterFrame() {

setBackground(Color.BLACK);

setTitle("Counter");

setSize(240,280);

setResizable(false);

JMenuBar jbar = new JMenuBar();

JMenu modus = new JMenu("Modus");

JRadioButtonMenuItem gfx_modus = new JRadioButtonMenuItem("GFX Modus");

JRadioButtonMenuItem txt_modus = new JRadioButtonMenuItem("TXT Modus");

jbar.add(modus);

modus.add(gfx_modus);

modus.add(txt_modus);

ButtonGroup modus_gruppe = new ButtonGroup();

modus_gruppe.add(gfx_modus);

modus_gruppe.add(txt_modus);

gfx_modus.setSelected(true);

setJMenuBar(jbar);

Container content = getContentPane();

CounterControlPanel control_panel = new CounterControlPanel();

setLayout(new BorderLayout());

if (gfx_modus.isSelected()) {

GFXCounterPanel counter_panel = new GFXCounterPanel();

content.add(counter_panel, BorderLayout.CENTER);

content.add(control_panel, BorderLayout.SOUTH);

}

else {

if (txt_modus.isSelected()) {

LABELCounterPanel counter_panel = new LABELCounterPanel();

content.add(counter_panel, BorderLayout.CENTER);

content.add(control_panel, BorderLayout.SOUTH);

}

}

}

Hoffe das ich das problem einigermaßen verständlich formuliert hab. Ich danke für jede Antwort.

Gruß Adrian

Link zu diesem Kommentar
Auf anderen Seiten teilen

So kann das schonmal nicht gehen. Die if(...isSelcted) werden ja direkt im Konstruktor geprüft, und da sind sie natürlich noch nicht aktiv.

1.) Deine Klasse muss als erstes mal die Abstrakte Klasse ActionListener implementieren ( class Gui externs JFrame implements ActionListener { ... )

2.) Nun muss du noch die Methode actionPerformed() implementieren (wenn du eine vollwertige IDE wie Eclipse benutzt, wird er dir das auch mitteilen).

Dazu baust du einfach diesen Code ein:

void actionPerformed(ActionEvent e) {

//siehe Punkt 3

}
3.) Jetzt musst der ActionListener noch zwischen den beiden Radiobuttons unterscheiden lernen, dazu brauchst du Code in dieser Art (innerhalb von actionPerformed() ):

String cmd = e.getActionCommand();


if(cmd == "Gfx") {

//foo

}

else if(cmd == "Txt) {

//bar

}

Man könnte natürlich auch nen Switchblock benutzen, muss man aber nicht. 4.) Die Buttons brauchen einen Actioncommand. Das machst du mit:

gfx_modus.setActionCommand("Gfx");

//für den anderen auch

5.) Jetzt müssen die Buttons noch wissen, an wen sie ihren NAchrichten schicken sollen. Da die Klasse in diesem Fall selbst der ActionListener ist, brauchst du nur ein:

gfx_modus.addActionListener(this);

//für den anderen auch

Eigentlich ganz einfach :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es muß doch möglich sein, zur Laufzeit herauszufinden, welcher RadioButton aktiv ist. Da gibt's garantiert 'nen Listener für.

Ja das ist möglich --> .isSelected();

Danke für die Antwort nur leider war nicht das die Problemstellung.

Ich möchte nicht wissen welcher selektiert ist, sonder das je nach dem welcher von den RadioButtons selektiert ist, die Oberfläche sich ändert. in dem fall ein anderes Panel einem Container geaddet wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die schnellen antworten :) ! nur leider auch nicht das was mir helfen könnte

so hatte ich das auch schon gehabt mit den Actionlistenern:

String cmd = e.getActionCommand();

if(cmd == "Gfx") {

//foo

}

else if(cmd == "Txt) {

//bar

}

... nur wußt ich dann nicht wie ich meinem programm mitteilen soll das er das fenster neuaufbauen muß und dem container "content" das panel added , das (mittels dem JRadioButton) gewählt wurde.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke ! Das mit content.remove(gfx_counter_panel); war gut :) Jetzt hab ich das Panel mittels ActionListener entfernt nur leider krieg ich kein neues Panel geadded :)

Ich platz irgendwann , das kann doch net so schwer sein ;)

hier nochmal mein modifizierter code schnipsel (Frame Kontruktor und der ActionListener):


public class CounterFrame extends JFrame {


	private String path = "Counter/Digitals/";

	private int number;


	private GFX_CounterPanel gfx_counter_panel = new GFX_CounterPanel();

	private TXT_CounterPanel txt_counter_panel = new TXT_CounterPanel();

	private CounterControlPanel control_panel = new CounterControlPanel();

	private Container content = getContentPane();


	CounterFrame() {

		setBackground(Color.BLACK);

		setTitle("Counter");

		setSize(240,280);

		setResizable(false);


		setLayout(new BorderLayout());


		content.add(gfx_counter_panel, BorderLayout.CENTER);

		content.add(control_panel, BorderLayout.SOUTH);


		JMenuBar jbar = new JMenuBar();

		JMenu modus = new JMenu("Modus");

		JRadioButtonMenuItem gfx_modus = new JRadioButtonMenuItem("GFX Modus");

		JRadioButtonMenuItem txt_modus = new JRadioButtonMenuItem("TXT Modus");

		jbar.add(modus);


		modus.add(gfx_modus);

		gfx_modus.setSelected(true);

		gfx_modus.addActionListener(new JRadioButtonListener());

		modus.add(txt_modus);

		txt_modus.addActionListener(new JRadioButtonListener());


		ButtonGroup modus_gruppe = new ButtonGroup();

		modus_gruppe.add(gfx_modus);

		modus_gruppe.add(txt_modus);


		setJMenuBar(jbar);


	}


	public class JRadioButtonListener implements ActionListener {


		public void actionPerformed(ActionEvent e) {

			 String command = e.getActionCommand();


			 if(command == "GFX Modus") {

				 content.remove(txt_counter_panel);

				 GFX_CounterPanel gfx_counter_panel = new GFX_CounterPanel();

				 content.add(gfx_counter_panel, BorderLayout.CENTER);

				 repaint();

			 }

			 else {

				 if(command == "TXT Modus") { 

					 content.remove(gfx_counter_panel);

					 TXT_CounterPanel txt_counter_panel = new TXT_CounterPanel();

					 content.add(txt_counter_panel, BorderLayout.CENTER);

					 repaint();


				 }

			 }

		}

	}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Strings vergleicht man mit

strA.equals(strB);


if(command.equals("GFX Modus")) {

				 content.remove(txt_counter_panel);

				 GFX_CounterPanel gfx_counter_panel = new GFX_CounterPanel();

				 content.add(gfx_counter_panel, BorderLayout.CENTER);

				 repaint();

			 }

			 else  if(command.equals("TXT Modus")) { 

					 content.remove(gfx_counter_panel);

					 TXT_CounterPanel txt_counter_panel = new TXT_CounterPanel();

					 content.add(txt_counter_panel, BorderLayout.CENTER);

					 repaint();


				 }

			 }


lies dir mal einpaar tutorials durch...

javabuch u.s.w.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So wie ich das sehe hast du jetzt 2 Klassen. Zum einen den CounterFrame und dann den JRadioButtonListener.

In dem JRadioButtonListener benutzt du content. Das ist aber ein private attribute aus der Frame Klasse.

Außerdem erstellst du im ActionListener neue Instanzen der Klassen TXT_CounterPanel bzw. GFX_CounterPanel.

Die sind dann aber wiederum nur in der JRadioButtonListener Klasse bekannt

Link zu diesem Kommentar
Auf anderen Seiten teilen

So wie ich das sehe hast du jetzt 2 Klassen. Zum einen den CounterFrame und dann den JRadioButtonListener.

In dem JRadioButtonListener benutzt du content. Das ist aber ein private attribute aus der Frame Klasse.

Außerdem erstellst du im ActionListener neue Instanzen der Klassen TXT_CounterPanel bzw. GFX_CounterPanel.

Die sind dann aber wiederum nur in der JRadioButtonListener Klasse bekannt

Genau. Naja. Fast. So wie ich das sehe, ist JRadioButtonListener eine innere Klasse und kann so auf die Attribute der äußeren Klasse zugreifen. Mit content.remove(txt_counter_panel) entfernst Du korrekt das vorher hinzugefügte Panel.

Mit content.add() fügst Du in Deinem Code aber ein neu initialisiertes (und somit leeres) Panel hinzu. Dazu verdeckst Du mit der Variablendeklaration die Variable der Klasse CounterFrame.

Um es auf einen Punkt zu bringen:


if(command == "GFX Modus") {

  content.remove(txt_counter_panel);

  content.add(gfx_counter_panel, BorderLayout.CENTER);

  repaint();

} else if(command == "TXT Modus") { 

  content.remove(gfx_counter_panel);

  content.add(txt_counter_panel, BorderLayout.CENTER);

  repaint();

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, ich nochmal :)

Mit den OOP´s bin ich eigentlich vertraut, ich hab halt nicht so viel Zeit zu üben. Bin im ziemlichen stress, in letzter zeit :) Schreibe ein haufen Klausuren und das nicht nur in JAVA. Ich hoffe das geht in ordnung wenn ich euch mit meinem Problem, wenn auch (im nachhinein) bißchen überflüssigen, bombardiert hab ;)

Danke an alle die geantwortet haben !:beagolisc

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...