Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Java Layout frage

Empfohlene Antworten

Veröffentlicht

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 ?

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

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.

  • 2 Wochen später...
  • Autor

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.

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

  • Autor

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:

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

Ansonsten musst du ja immer mit setVisible arbeiten

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.