Zum Inhalt springen

Java Layout frage


Marv04

Empfohlene Beiträge

Moin Leute,

und zwar habe ich eine frage an euch und zwar möchte ich durch einen Klick auf einen Button das jetzige Layout schließen und durch ein neues ersetzten, aber ich weiß nicht wie, damit habe ich noch nie gearbeitet, hatte sozusagen immer nur single Layouts..

Hier einmal meine Mainframe, das ist jetzt nur ein Projektbeispiel, und zwar soll jetzt durch klick auf den Button der Zweite Quelltext angezeigt werden und der Button soll verschwinden.

MainFrame Code


import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.JButton;

import javax.swing.JFrame;



public class mainFrame extends JFrame implements ActionListener {


	//Objekt der klasse Test angelegt

	test t = new test();


	//Button anlegen

	private JButton btntest = new JButton("New Layout");


	Container cp = getContentPane();


	public mainFrame(){


		cp.setLayout(null);


		btntest.setBounds(100, 50, 100, 30);


		cp.add(btntest);


		setTitle("");

		setSize(300,300);


		setDefaultCloseOperation(EXIT_ON_CLOSE);

		setVisible(true);


		add(t, BorderLayout.CENTER);


		btntest.addActionListener(this);


	}	



	public static void main(String[] args) {

		// TODO Auto-generated method stub

		new mainFrame();

	}


	@Override

	public void actionPerformed(ActionEvent arg0) {

		// TODO Auto-generated method stub

		if (arg0.getSource() == btntest) {

			cp.setVisible(false);

			t.setVisible(true);

		}

	}


}



Und hier das test layout was nachdem klick angezeigt werden soll..

import java.awt.BorderLayout;

import java.awt.Container;


import javax.swing.JButton;

import javax.swing.JPanel;

import javax.swing.JTextField;



public class test extends JPanel {


	private JTextField txt1 = new JTextField();

	private JTextField txt2 = new JTextField();


	private JButton reset = new JButton("Zurücksetzten");


	public test(){


		setLayout(new BorderLayout(10,10));


		add(txt1);

		add(txt2);

		add(reset);


	}

}


Die frage ist halt nun, wie kriege ich das hin ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Hi,

also bitte nur vorab: Schreibe dir Klassen immer mit einem großen Anfangsbuchstaben. Es funktioniert zwar auch so, aber es wird nicht empfohlen, Klassen mit kleinen Buchstaben anzufangen.

Nun zu deinem Problem:

Ein JFrame kannst du dir im Grund als Fenster vorstellen. Ich würde jetzt versuchen einfach zwei JPanels zu machen, einmal mit dem Button und einen mit der zweiten Ansicht.

Im Constructor vom JFrame kannst du dann den JPanel mit dem Button adden. Hier würde ich auch nicht unbedingt mit visible arbeiten.

In der Action würde ich dann ein removeAll(); vom JFrame aufrufen und ein add für den zweiten JPanel.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast KnapsackSolver

Eigentlich ist deine Frage ganz einfach, wenn ich sie richtig verstanden habe.

Du erzeugst einfach ein JFRAME und legst darauf ein Panel mit deinem Button etc...

Wenn du nun auf den Button klickst, erzeugst du ein neues Panel und löschst dein alter. Jetzt musst du das neue Panel dem Frame übergeben und alles wieder neu zeichnen.

So müsste dein Problem gelöst werden können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Sorry Jungs.. im Prüfungsstress Total vergessen hier wieder vorbei zu schauen..

Ich versteh was ihr meint bzw was ich machen soll.. mir fehlt aber die zündende idee das umzusetzten.. habt ihr da ein beispiel Code oder wisst wo ich das nachschlagen kann ?

Im Constructor vom JFrame kannst du dann den JPanel mit dem Button adden. Hier würde ich auch nicht unbedingt mit visible arbeiten.

In der Action würde ich dann ein removeAll(); vom JFrame aufrufen und ein add für den zweiten JPanel.

Du meinst also ich solle die Buttons in ein JPanel auslagern ? habe ich jetzt gemacht (habe eine Mainframe und ein Startpanel mit den Buttons und drei weitere Panels die auf Button klick aufgerufen werden sollen), bin auch nun soweit das ich durch klick die verschiedenen Panels aufrufen kann, bin aber damit absolut nicht zufrieden.. ich kann es posten weiß aber nicht ob es eventuell zu viel ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast KnapsackSolver

Marv04, was passt dir denn dann noch nicht ?

Also das eigentliche Problem ist jetzt gelöst ?

und was willst du jetzt weiterhin verändern ? Du kannst natürlich auch einfach einige Komponenten ausblenden wenn du die für den Moment dann nicht mehr benötigst ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey SakulRelda,

ja das eigentliche Problem ist gelöst, aber ich glaube es ist nicht Optimal gelöst.

Ich Poste mal mein Startpanel wo sich das ganze abspielt.

package view;


import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.JButton;

import javax.swing.JPanel;


public class Startpanel extends JPanel implements ActionListener{


	private panelabc test1 = new test1(); 


	private panel123 test2 = new test2();


	private panelpic test3 = new test3();


	private JButton btn1 = new JButton("Test1");

	private JButton btn2 = new JButton("Test2");

	private JButton btn3 = new JButton("Test3");


	private JPanel AllBtn = new JPanel();

	public Startpanel(){




		AllBtn.add(Test1);

		AllBtn.add(Test2);

		AllBtn.add(Test3);


		Test1.addActionListener(this);

		Test2.addActionListener(this);

		Test3.addActionListener(this);


		setLayout(new BorderLayout(10,10));

		add(AllBtn, BorderLayout.NORTH);


		//Test1 Panel hinzufügen

		add(Test1, BorderLayout.CENTER);

		Test1.setVisible(false);


		//Test2 Panel hinzufügen

		add(Test2, BorderLayout.WEST);

		Test2.setVisible(false);


		// Panel Test3 hinzufügen

		add(Test3, BorderLayout.EAST);

		Test3.setVisible(false);


	}



	@Override

	public void actionPerformed(ActionEvent arg0) {

		// TODO Auto-generated method stub

		if (arg0.getSource() == Test1) {

			AllBtn.setVisible(false);

			Test1.setVisible(true);

		}


		if (arg0.getSource() == Test2) {

			AllBtn.setVisible(false);

			Test2.setVisible(true);

		}


		if (arg0.getSource() == Test3) {

			AllBtn.setVisible(false);

			Test3.setVisible(true);

		}

	}


}

Es sieht jetzt so aus das sobald ich auf einen Button klicke das entsprechende Panel erscheint.. Das Problem ist aber noch das ich das ganze nicht Zentriert angezeigt bekomme, sobald ich bei allen drei Panels Borderlayout.Center stehen habe werden sie nach einem Klick nicht angezeigt. Erst sobald ich es so mache wie es jetzt zu sehen ist kriege ich die Panels angezeigt. :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gast KnapsackSolver

Ja du könntest auch mit Repaint oder Validate arbeiten.

Laut API-Doc:

public void repaint() : Repaints this component.

public void validate() : Ensures that this component has a valid layout. This method is primarily intended to operate on instances of Container.

Wenn du Layout veränderst, also irgendwelche Komponenten hinzufügst/entfernst, musst du dem Layoutmamager sagen, dass er sich bemühen muss -> (re)validate() (=neuberechnen) aufrufen

das ruft auch repaint() auf

Wenn du nur "zeichentechnisch" was änderst, ohne das Layout zu verändern, dann repaint() (=neuzeichnen)

> Ich hoffe ich konnte dir damit ein neuen Ansatz zeigen

Also du kannst im Prinzip dein Layout verändern und danach einfach die validate-methode aufrufen, so wird dann die Änderung angezegit

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