# java gui Anmeldung



## Feras (15. Jan 2015)

Hi, ich versuche eine einfache GUI für ein Anmeldesystem zu erstellen. Doch ich verstehe nicht, warum die Anordnung so komisch ist. Der JButton "Anmelden" sollte doch eigentlich den ganzen unteren Platz einnehmen und die JLabel Benutzername und Passwort müssten doch eigentlich vor den JTextfields stehen? Hat jemand einen Rat?


MfG Feras


----------



## Khal Drogo (15. Jan 2015)

Willst du uns nicht vielleicht Code liefern?

Mit freundlichen Grüßen
Xelsarion


----------



## Feras (15. Jan 2015)

Xelsarion hat gesagt.:


> Willst du uns nicht vielleicht Code liefern?
> 
> Mit freundlichen Grüßen
> Xelsarion



ups 


```
import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class LehvisGUI extends JFrame {

	public LehvisGUI() {
		setTitle("Lehvis-Anmeldung");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		zeigeAnmeldeGUI();
		pack();
		setVisible(true);

	}

	private void zeigeAnmeldeGUI() {

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setLayout(new GridLayout(/* 3 */0, 2, 6, 3));

		add(new JLabel(
				"<HTML><BODY>Eingerichtet sind Benutzer Tutor1 und Student1 bis <br> Student9 jeweils mit gleichlautendem Passwort</BODY></HTML>"));
		add(new JLabel(" Benutzername: "));
		add(new JTextField());
		add(new JLabel(" Passwort:"));
		add(new JPasswordField());
		add(new JButton("Anmelden"), BorderLayout.SOUTH);

		pack();
		setVisible(true);

	}

	public static void main(String[] args) {

		new LehvisGUI();

	}
}
```


----------



## franky27 (15. Jan 2015)

Ich verstehe nicht so ganz was du hier machst. Du setzt zB die DefaultCloseOperation deine Frames im Konstruktor und rufst dann eine Methode auf, die das gleiche nochmal macht. Dann setzt du ein Gridlayout addest deine Komponenten und willst den JButton bezogen auf ein Borderlayout nach unten setzen.. packst das ganze doppelt und setzt es doppelt auf visible true. Schau dir am besten nochmal die Layoutmanager an und verschachtelungen dieser. Ich glaube was du eigentlich machen wolltest ist eine eigene JPanel Klasse mit deinen Komponenten die du dann in dein JFrame addest? Wie genau soll das ganze denn am Ende aussehen?
Edit: Momentan sieht es so aus, dass deine Komponenten einfach immer in zwei Spalten nebeneinander in das Gridlayout gesetzt werden und danach die nächste Reihe anfängt, so wie du es definierst hast.


----------



## Joose (16. Jan 2015)

Wie franky27 schon sagt: Dein Code ist wirr!
Auch macht es keinen Sinn das JTextField bzw. JPasswordField direkt als Parameter der add Methode zu erstellen. Wie willst du später auf den Inhalt dieser beiden Felder zugreifen?
Dazu solltest du aus diesen beiden Komponenten Klassenattribute machen.

Hinweis: Man sollte nicht von JFrame ableiten wenn man die Klasse nicht wirklich um Funktionalität erweitern will! (Nein Layout definieren und Komponenten setzen ist kein erweitern)


----------



## Feras (22. Jan 2015)

Das ganze soll ungefähr so wie im Anhang aussehen. Ist es denn möglich ,dass so zu machen, dass man in einer Methode den Schriftzug oben und den button unten per borderlayout und die beiden textfelder in der mitte per gridlayout realisert?


MfG Feras


----------



## Joose (22. Jan 2015)

Ja das ist möglich. Dein Code oben ist auch schon ein guter Anfang, aber hat eben noch Fehler 

1.) Die Felder die du auslesen willst sollten als Instanzvariablen deklariert werden
2.) Deine Klasse sollte nicht von JFrame ableiten (Erklärung siehe mein Post oben)


----------



## Feras (22. Jan 2015)

und wie kann man es bewerkstelligen, dass mein borderlayout dann nich vom gridlayout beeinflusst wird, sondern an einem bestimmten punkt einfach aufhört zu wirken?


----------



## Joose (22. Jan 2015)

Feras hat gesagt.:


> dass mein borderlayout dann nich vom gridlayout beeinflusst wird, sondern an einem bestimmten punkt einfach aufhört zu wirken?



Ein JPanel bzw. das JFrame kann immer NUR EIN Layout gleichzeitig haben!
Sprich um mehrere Layouts zu verwenden musst du diese einfach verschachteln.

Für dein Problem konkret:
Das JFrame sollte das BorderLayout gesetzt bekommen.
Im NORTH setzt du dein JLabel, im SOUTH den Button und im CENTER ein JPanel welches ein GridLayout gesetzt bekommt. Und diesem JPanel kannst du dann deine Label + Textfelder hinzufügen.


----------



## Feras (22. Jan 2015)

Da habe ich jetzt das Problem, dass ich das bis zum anmeldenButon machen kann, was du vorgeschlagen hast. Doch bei diesem weiß ich nicht, wie ich ihn per JFrame adden kann, da auf dem ja schon der actionlistener liegt. Und wenn ich es jetzt so ausführe, erhalte ich nur ein Fenster in dem der anmeldenbutton angezeigt wird und der Rest garnicht mehr.


```
public class LehvisGUI extends Frame {


	public LehvisGUI() {
		setTitle("Lehvis-Anmeldung");
		setSize(800, 400);
		setVisible(true);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent evt) {
				System.exit(0);
			}
		});
		zeigeAnmeldeGUI();
	}


	private void zeigeAnmeldeGUI() {

		JFrame frame = new JFrame();
		JPanel panel = new JPanel();

		frame.setLayout(new BorderLayout());

		frame.add(
				new JLabel(
						"<HTML><BODY>Eingerichtet sind Benutzer Tutor1 und Student1 bis <br> Student9 jeweils mit gleichlautendem Passwort</BODY></HTML>"),
				BorderLayout.NORTH);

		panel.setLayout(new GridLayout(/* 3 */0, 2, 6, 3));

		panel.add(new JLabel(" Benutzername: "));
		JTextField benutzerNameText = new JTextField(20);
		panel.add(benutzerNameText);

		panel.add(new JLabel("Passwort:"));
		JPasswordField passwortText = new JPasswordField(20);
		panel.add(passwortText);

		JButton anmeldenButton = new JButton("Anmelden");

		anmeldenButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				boolean erfolg = new Nutzerverwaltung().anmelden(
						benutzerNameText.getText(), passwortText.getText());
				if (erfolg) {
					setLayout(new GridLayout(1, 1));
					setTitle("Lehvis - angemeldeter Nutzer "
							+ Nutzerverwaltung.holeAngemeldeterNutzer()
									.holeVorname()
							+ " "
							+ Nutzerverwaltung.holeAngemeldeterNutzer()
									.holeName());
					removeAll();
					add(new UebungsverwaltungGUI(LehvisGUI.this));
					validate();
				} else {
					Popup1 popup = new Popup1("Falsche Eingabe!");
					// statusLabel.setVisible(true);
					benutzerNameText.setText("");
					passwortText.setText("");
				}
				validate();
			}
		});
		add(anmeldenButton);

		validate();
	}



	public static void main(String[] args) {
		new LehvisGUI();
	}

}
```


----------



## Joose (22. Jan 2015)

Feras hat gesagt.:


> Da habe ich jetzt das Problem, dass ich das bis zum anmeldenButon machen kann, was du vorgeschlagen hast. Doch bei diesem weiß ich nicht, wie ich ihn per JFrame adden kann, da auf dem ja schon der actionlistener liegt. Und wenn ich es jetzt so ausführe, erhalte ich nur ein Fenster in dem der anmeldenbutton angezeigt wird und der Rest garnicht mehr.



Ja weil du Punkt 2.) den ich weiter oben gepostet habe nicht beachtet hast!
Die Klasse "LehvisGUI" soll nicht von JFrame ableiten.

Und das du nur den Button siehst und sonst nichts liegt daran das du in der Methode "zeigeAnmeldeGUI" ein 2.Objekt von JFrame erstellst, und dort alles richtig hinzufügst.
Alles bis auf den Button den fügst du nicht diesem Frame hinzu, und sichtbar (setVisible(true)) setzt du dein JFrame auch nicht.


----------



## Foxei (22. Jan 2015)

Hallo Feras,
ich habe hier mal eine Beispiel GUI für dich und ich gehe jetzt einmal von oben nach unten für dich durch wie sie Funktioniert.

*Variablen*
Ich Definiere das _JTextField_ in dem später der User den Namen eingeben soll Global ohne ihn zu erzeugen also ist das _JTextField_ noch null. Selbiges wiederhole ich für das Passwort mit einem _JPasswordFiled_(zeigt das Passwort als Sternchen sonst gleich zum _JTextField_).

*Konstruktor* 
Zu beginn wird der Titel des _JFrame_ gesetzt, in diesem Fall "Anmelden". Dann Kommt die Aktion die er Unternehmen soll wenn man das Rote X Drückt, in diesem Fall NICHTS (wird fangen dies Später ab). Dann verbieten wir dem User die Größe der _JFrame_ zu ändern.

Dann definieren wir ein Layout für die _JFrame_, in diesem Fall das sehr Leistungsstarke _GridBagLayout_. (Fragen dazu immer gerne)

Der erste Component den wir Definieren ist ein _JLabel_ mit deinem Text. Die *HTML* Tags sorgen dafür das der Text in einem begrenzten Bereich (bei uns 260 zu 40 Pixeln) der Text Automatisch einen Zeilenumbruch macht. Nun wird der Component in Zelle 0,0 des Grids,auf zwei Grids breite, mit einer bevorzugten Größe von 260,40 sonst auf die komplette breite und einem Abstand von 5 Pixeln nach Links, Unten und Rechts gesetzt. (Näheres dazu Schlagwort *GridBagConstrains*)

Nun laden wird das _JTextField_ für den Benutzernamen mit platz für bevorzugt 20 Zeichen. Dieses wird nun Analog zu oben auf die _JFrame_ geadded.
Nun Erzeugen wird ein _JLabel_ das das _JTextField_ beschriebt und adden diese Analog in die Zelle vor das _JTextField_.

Ebenfalls Analog dazu nun das _JPasswordField_.

Ähnlich wie das _JLabel_ am Anfang adden wir nun ein neues _JPanel_ un die letzte Zeile (über zwei Spalten) des Grids. Auf das _JPanel_ kommt ein *FlowLayout*.

Nun erzeugen wir die Beiden _JButtons_ den einen mit der Action zum Abbrechen (cancel() und den Anderen mit der Aktion sich anzumelden (login() dabei übergibt er den Inhalt auf dem BenutzenamenFeld und das eingegeben Passwort.

Daraufhin lassen wir die _JFrame_ ihre benötigte Größe selbst bestimmen und setzen sie in die Mitte des Bildschirms.

Nun kommen wir zu dem angesprochenen Abfange der CloseOperation. Mit einem *WindowListener* überwachen wir das Window und wenn nun einer das Rote X drückt wird die Methode WindowClosing() ausgeführt diese leiten wir weiter zu Methode cancel();. Somit machen das Rote X und der Abbrechen Button nun das selbe.

*Code*

```
package AnmeldeGui;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AnmeldeGUI extends JFrame {

	private static final long serialVersionUID = -5202218461238188876L;

	private JTextField txtName;
	private JPasswordField txtPassword;

	public AnmeldeGUI() {
		setTitle("Anmelden");
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		setResizable(false);

		GridBagLayout gbl_contentPane = new GridBagLayout();
		gbl_contentPane.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
		gbl_contentPane.rowWeights = new double[]{1.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		setLayout(gbl_contentPane);
		
		JLabel lblTitel = new JLabel("<html>Eingerichtet sind Benutzer \"Tutor1\" und \"Stundent1\" bis \"Student9\" jeweil mit gleichlautendem Passwort.</html>");
		lblTitel.setPreferredSize(new Dimension(260,40));
		GridBagConstraints gbc_lblTitel = new GridBagConstraints();
		gbc_lblTitel.gridwidth = 2;
		gbc_lblTitel.fill=GridBagConstraints.HORIZONTAL;
		gbc_lblTitel.insets = new Insets(0, 5, 5, 0);
		gbc_lblTitel.gridx = 0;
		gbc_lblTitel.gridy = 0;
		add(lblTitel, gbc_lblTitel);
		
		txtName = new JTextField();
		txtName.setColumns(20);
		GridBagConstraints gbc_txtName = new GridBagConstraints();
		gbc_txtName.insets = new Insets(0, 0, 5, 5);
		gbc_txtName.fill = GridBagConstraints.HORIZONTAL;
		gbc_txtName.gridx = 1;
		gbc_txtName.gridy = 1;
		add(txtName, gbc_txtName);
		txtName.setColumns(10);
		
		JLabel lblAnmeldename = new JLabel("Anmeldename:");
		lblAnmeldename.setLabelFor(txtName);
		GridBagConstraints gbc_lblAnmeldename = new GridBagConstraints();
		gbc_lblAnmeldename.anchor = GridBagConstraints.WEST;
		gbc_lblAnmeldename.insets = new Insets(0, 5, 5, 5);
		gbc_lblAnmeldename.gridx = 0;
		gbc_lblAnmeldename.gridy = 1;
		add(lblAnmeldename, gbc_lblAnmeldename);
		
		txtPassword = new JPasswordField();
		txtPassword.setColumns(20);
		GridBagConstraints gbc_txtPassword = new GridBagConstraints();
		gbc_txtPassword.insets = new Insets(0, 0, 5, 5);
		gbc_txtPassword.fill = GridBagConstraints.HORIZONTAL;
		gbc_txtPassword.gridx = 1;
		gbc_txtPassword.gridy = 2;
		add(txtPassword, gbc_txtPassword);
		
		JLabel lblPasswort = new JLabel("Passwort:");
		lblPasswort.setLabelFor(txtPassword);
		GridBagConstraints gbc_lblPasswort = new GridBagConstraints();
		gbc_lblPasswort.insets = new Insets(0, 5, 5, 5);
		gbc_lblPasswort.anchor = GridBagConstraints.WEST;
		gbc_lblPasswort.gridx = 0;
		gbc_lblPasswort.gridy = 2;
		add(lblPasswort, gbc_lblPasswort);
		
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout(FlowLayout.TRAILING, 0, 0));
		GridBagConstraints gbc_panel = new GridBagConstraints();
		gbc_panel.gridwidth = 2;
		gbc_panel.insets = new Insets(0, 0, 5, 5);
		gbc_panel.fill = GridBagConstraints.BOTH;
		gbc_panel.gridx = 0;
		gbc_panel.gridy = 3;
		add(panel, gbc_panel);
		
		JButton btnAnmelden = new JButton("Anmelden");
		btnAnmelden.addActionListener(e->login(txtName.getText(),txtPassword.getPassword()));
		panel.add(btnAnmelden);
		
		JButton btnAbbrechen = new JButton("Abbrechen");
		btnAbbrechen.addActionListener(e->cancel());
		panel.add(btnAbbrechen);
		
		pack();
		setLocationRelativeTo(null);
		
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				cancel();
			}
		});
		
		setVisible(true);
	}

	private void cancel(){
		System.out.println("Login abort");
		//TODO Something
		setVisible(false);
	}
	private void login(String name,char[] passwort){
		System.out.println("Try to login");
		//TODO Something
	}
	
	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException | InstantiationException| IllegalAccessException | UnsupportedLookAndFeelException e) {
			e.printStackTrace();
		}
		new AnmeldeGUI();
	}
}
```


----------



## Feras (22. Jan 2015)

Danke, kennst du ein gutes Tutorial für solche GridBagLayouts?


----------



## Foxei (22. Jan 2015)

Ich habe mir das über die Standard Oracle Tutorials beigebracht aber geh doch mal auf YouTube wird sich bestimmt was finden.


----------

