Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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.
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)
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?
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)
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?
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.
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.
Java:
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();
}
}
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.
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
Java:
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();
}
}