Fenster in einem Fenster anordnen

vik0809

Mitglied
Hallo,

Ich bin Anfänger im Bereich der Java und Java - Swing Programmierung. Ich würde gerne ein Login Fenster programmieren. Dabei sollen 2 Fenster in dem Hauptfenster platziert sein, welche mit einem Rand und einer Beschriftung versehen werden soll (siehe Bild).

Mein Ansatz war der, dass ich die Klasse von JFrame ableite und diesem JFrame einen Titel, Größe usw. gebe. Und ein JPanel mit einer kleineren Größe auf das JFrame lege.

Java:
public class Login_Fenster extends JFrame {

    public Login_Fenster() {
        
        
        JFrame Oberflaeche = this;
        JPanel login_anmeldung = new JPanel();
        
        Oberflaeche.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Oberflaeche.setTitle("Login");
        Oberflaeche.setSize(new Dimension(500, 500));
        
        Oberflaeche.setBackground(Color.WHITE);
        
           
        Oberflaeche.add(login_anmeldung);
       
        Oberflaeche.setVisible(true);
        
    }
    
    public static void main(String[] args) {
        
      
       new Login_Fenster();
      
        
    }
    
}

könnt ihr mir bitte Hinweise darauf geben, wie ich das realisieren kann?
 

Anhänge

  • Hauptfenster - Login.jpg
    Hauptfenster - Login.jpg
    32,3 KB · Aufrufe: 55
das Frame auf FlowLayout mit vertikaler Ausrichtung setzen und 2 JPanels hinzufügen. Jedes JPanel enthält dann sozusagen einen Teil deines Fensters mit entsprechender TitledBorder (glaube ich)
 
Vielen Dank für die Antwort. Ich habe es inzwischen folgendermaßen gelöst bekommen:

Java:
public class Login_Fenster extends JFrame {

        
        
    public Login_Fenster() {
        
            
        
        
        
        TitledBorder login_anmeldung_titel;
        TitledBorder neuer_benutzer;
        JFrame oberflaeche = this;
        JPasswordField password_feld = new JPasswordField();
        JPasswordField password_feld_neu = new JPasswordField();
        password_feld.setEchoChar('*');
        password_feld_neu.setEchoChar('*');
        
        JButton ok = new JButton("ok");
        JButton ok2 = new JButton("ok");
        JButton paswwort_vergessen = new JButton("Passwort vergessen");
        
        JLabel benutzername_label = new JLabel();
        JLabel gewünschter_benutzer = new JLabel();
        JLabel password_label = new JLabel();
        JTextField benutzername = new JTextField();
        JTextField benutzername_neu = new JTextField();
        
        
        int anmeldungsgröße_X = 400;
        int anmeldungsgröße_Y = 200;
        
        JDesktopPane desktop = new JDesktopPane();      //ist ein Container für das Platzieren von Unterfenster
        JPanel login_anmeldung = new JPanel();
        JPanel benutzer_reg = new JPanel();
        
        
        oberflaeche.setSize(600, 600);     
        login_anmeldung.setSize(300, 300);
        benutzer_reg.setSize(300, 300);
        
        oberflaeche.getContentPane().add(desktop);
        
        login_anmeldung.setBounds( 100, 100, anmeldungsgröße_X, anmeldungsgröße_Y );
        login_anmeldung_titel = BorderFactory.createTitledBorder("Login-Anmeldung");
        login_anmeldung.setBorder(login_anmeldung_titel);
        login_anmeldung.setBackground(Color.WHITE);
        
        benutzer_reg.setBounds( 100, 300, anmeldungsgröße_X, anmeldungsgröße_Y );
        neuer_benutzer = BorderFactory.createTitledBorder("Benutzer neu registrieren");
        benutzer_reg.setBorder(neuer_benutzer);
        benutzer_reg.setBackground(Color.WHITE);
        
        benutzername.setPreferredSize(new Dimension(100, 30));
        password_feld.setPreferredSize(new Dimension(100, 30));
        password_feld_neu.setPreferredSize(new Dimension(100, 30));
        
       benutzername_neu.setPreferredSize(new Dimension(100, 30));
        
       benutzername_label.setText("Benutzername");
       benutzername_label.setFont(null);
       password_label.setText("Passwort");
       gewünschter_benutzer.setText("gewünschter Benutzername");
                            
            
    
        desktop.add(login_anmeldung);
        
        login_anmeldung.add(benutzername_label);
        login_anmeldung.add(benutzername);
        login_anmeldung.add(password_label);
        login_anmeldung.add(password_feld);
        login_anmeldung.add(ok);
        login_anmeldung.add(paswwort_vergessen);
       
        desktop.add(benutzer_reg);
        benutzer_reg.add(gewünschter_benutzer);
        benutzer_reg.add(benutzername_neu);
        benutzer_reg.add(password_label);
        benutzer_reg.add(password_feld_neu);
        benutzer_reg.add(ok2);
        
       
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Login");
        this.setVisible(true);
     
    }
    
   
    
    
    public static void main(String[] args) {
        
      
       new Login_Fenster();
      
        
    }
    
}

Jedoch habe ich es nicht hinbekommen, die Buttons und Textfelder innerhalb der Panels zu positionieren bzw. welchen LayoutManager ich verwenden soll.

Auch habe ich noch nicht verstanden, wie man von einer Klasse auf eine andere verweisen kann (ich möchte einen MouseListener für die Buttons aus der Hauptklasse hinzufügen und das in einer externen Klasse).

Es wäre toll von euch, wenn ihr mir Tipps dazu geben könntet

Vielen Dank im voraus
 
Java:
public class Login_Fenster extends JFrame {
    public Login_Fenster() {
        TitledBorder login_anmeldung_titel;
        TitledBorder neuer_benutzer;
        JFrame oberflaeche = this;
    ......
}

Es wäre toll von euch, wenn ihr mir Tipps dazu geben könntet

Leite nur von der Klasse JFrame ab wenn du diese wirklich um Funktionalität erweitern willst. Ansonsten verwende einfach ein Objekt von JFrame als Klassenattribut!

Gib die "_" aus den Bezeichner raus. Und verwende stattdessen "lowerCamelCase"-Schrift. "_" stören Schreib- und Lesefluss und mit einem Doppelklick kann man meist nur den Text zwischen 2 "_" makieren 😉

Gib nicht den ganzen Code in den Konstruktor bzw. 1 Methode sondern Teile den Code auf mehrere Methode (z.B.: addLoginPanel, addCreateUserPanel, ...) auf. Das macht den Code übersichtlicher und leichter wartbar. Bzw. wenn du bestimmte Stellen nicht mehr brauchst oder herum probieren willst reicht meist ein Kommentar und ein Panel wird nicht mehr angezeigt etc.


Jedoch habe ich es nicht hinbekommen, die Buttons und Textfelder innerhalb der Panels zu positionieren bzw. welchen LayoutManager ich verwenden soll.

Spiele dich herum mit verschiedernen LayoutManagern. Test einfach jeden und probiere herum. Je nach gewünschten Endergebnis musst du den aus deiner Sicht passenden wählen (das andere es anders aufbauen würden etc. lass mal beiseite, jeder hat Vorlieben).

Auch habe ich noch nicht verstanden, wie man von einer Klasse auf eine andere verweisen kann (ich möchte einen MouseListener für die Buttons aus der Hauptklasse hinzufügen und das in einer externen Klasse).

Das sind Grundlagen der OOP, wiederhole diese wenn sie noch nicht sitzen! Sollte man für die GUI Programmierung beherrschen.
(Ansonsten: Erstelle eine Objekt deineses Listener und gib ihm die entsprechenden Referenzen die er braucht)
 
Vorallem solltest du dich mal mit Layoutmanagern befassen,

in deinem Fall könntest du auch einfach ein BoxLayout nutzen und eben demensprechend diesem 2 JPanel mit dem von dir benötigten Inhalten hinzufügen.

[EDIT]
Für die 2 JPanel empfehle ich dir Das GridBagLayout() dieses ist zwar anfangs etwas komplexer, allerdings lassen sich damit auch ziemlich aufwendige Layouts relativ einfach realisieren.
[/EDIT]
 
Zuletzt bearbeitet:
Danke euch. Ich habe nun versucht das von euch umzusetzen.

Ich habe nun nicht mehr alles in einer Funktion, sondern in mehreren und auch mehreren Klassen. Jedoch zeigt es nun gar keine Elemente mehr an.

Meine Main Klasse ist nun klein gehalten (sie ruft nur die init Funktion der Klasse Initialisierung auf)
Java:
public class Zeiterfassung2  {
    
    
    
    public static void main(String[] args) {
        new Zeiterfassung2();
    }

    public Zeiterfassung2() {
        Initialisierung init = new Initialisierung();
    }

}

Meine Initialisierungsklasse:
Java:
public class Initialisierung {
    
    JFrame oberflaeche;
    
    public Initialisierung() {
        
        //Frames und ContentPanes
        oberflaeche = new JFrame();     //neues Fenster zeichnen
        JDesktopPane desktop = new JDesktopPane();
        
        //JPanel
        JPanel loginAnmeldung = new JPanel(new GridBagLayout());
        JPanel benutzerReg = new JPanel(new GridBagLayout());
        
        //Passwordfelder
        JPasswordField passwortAnmeldung = new JPasswordField();
        JPasswordField passwortRegistrieren = new JPasswordField();
        
        //Textfelder
        JTextField benutzerNameAnmeldung = new JTextField();
        JTextField benutzerNameRegistrierung = new JTextField();
        
        //Labels
        JLabel benutzerNameAnmeldungLabel = new JLabel("Benutzername");
        JLabel passwortLabel = new JLabel("Passwort");      //gleiches Label für Anmeldung und Registrierung
        JLabel benutzerNameRegistrierungLabel = new JLabel("gewünschter Benutzername");
        
        //Buttons
        JButton benutzerAnmeldungOk = new JButton("OK");
        JButton benutzerRegistrierungOk = new JButton("OK");
        JButton benutzerAnmeldungPasswort = new JButton("Passwort vergessen");
        
        //für Rahmen
        TitledBorder loginAnmeldungRahmen = null;
        TitledBorder benutzerRegistrierenRahmen = null;
        
        
        LoginAnordnung login = new LoginAnordnung(loginAnmeldung, benutzerNameAnmeldungLabel, 
                passwortLabel, benutzerNameAnmeldung, passwortAnmeldung,
                benutzerAnmeldungOk, benutzerAnmeldungPasswort);
        
      
        BenutzerAnordnung benutzer = new BenutzerAnordnung(benutzerReg, benutzerNameRegistrierungLabel, passwortLabel, 
                benutzerNameRegistrierung, passwortRegistrieren, benutzerRegistrierungOk);
        
        GroessenAngaben groessen = new GroessenAngaben(oberflaeche, loginAnmeldung, benutzerReg, benutzerNameAnmeldung, benutzerNameRegistrierung, 
                passwortAnmeldung, passwortRegistrieren);
        
        
        Rahmen rahmen = new Rahmen(loginAnmeldungRahmen, benutzerRegistrierenRahmen, loginAnmeldung, benutzerReg);
        
        
        JFrameEigenschaften eigenschaftenJFrame = new JFrameEigenschaften(oberflaeche, desktop);
        
    }
   
    
}

Die Klasse, welche sich nur um die Anordnung des Anmeldungs Panels kümmert
Java:
public class LoginAnordnung {
    
    //Es werden die Labels für die Login Anmeldung hinzugefügt
    public LoginAnordnung(JPanel loginAnmeldung,
        JLabel benutzerNameAnmeldungLabel, JLabel passwortLabel, 
        JTextField benutzerNameAnmeldung, JPasswordField  passwortAnmeldung,
        JButton benutzerAnmeldungOk, JButton  benutzerAnmeldungPasswort) {
        
        loginAnmeldung.add(benutzerNameAnmeldungLabel);     //Benutzername
        loginAnmeldung.add(benutzerNameAnmeldung);          //TextFeld für Benutzername
        loginAnmeldung.add(passwortLabel);                  //Passwort
        loginAnmeldung.add(passwortAnmeldung);              //TextFeld für Passwort
        loginAnmeldung.add(benutzerAnmeldungOk);            //OK Button Login - Anmeldung
        loginAnmeldung.add(benutzerAnmeldungPasswort);      //Passwort vergessen Button
    }
    
    
    
}

...und das die Klasse, welche sich nur um die Anordnung vom Benutzerpanel sich kümmert:

Java:
public class BenutzerAnordnung {

    public BenutzerAnordnung(JPanel benutzerReg, JLabel benutzerNameRegistrierungLabel, JLabel passwortLabel, 
            JTextField benutzerNameRegistrierung, JPasswordField passwortRegistrieren, 
            JButton benutzerRegistrierungOk) {
        
                 
        benutzerReg.add(benutzerNameRegistrierungLabel);        //gewünschter Benutzername
        benutzerReg.add(benutzerNameRegistrierung);             //TextFeld für gewünschter Benutzername
        benutzerReg.add(passwortLabel);                         //Passwort
        benutzerReg.add(passwortRegistrieren);                  //TextFeld für Passwort
        benutzerReg.add(benutzerRegistrierungOk);
    }
    
    
    
}

Um die Größen der einzelnen Elemente zu setzen, habe ich auch eine Klasse erstellt:
Java:
public class GroessenAngaben {

    public GroessenAngaben(JFrame oberflaeche, JPanel loginAnmeldung, JPanel benutzerReg, 
        JTextField benutzerNameAnmeldung, JTextField benutzerNameRegistrierung, 
        JPasswordField passwortAnmeldung, JPasswordField passwortRegistrieren) {
        
        
        //GrößenInformationen für die Oberfläche
        int breiteOberflaeche = 600;
        int hoeheOberflaeche = 600;
        
        //Größeninformation für das Panel Login Anmeldung
        int breiteLoginAnmeldung = 200;
        int hoeheLoginAnmeldung = 200;
        
        //Größeninformation für das Panel Benutzer neu registrieren
        int breiteBenutzerReg = 200;
        int hoeheBenutzerReg = 200;
        
        //Größeninformationen für das TextFeld von Benutzername des Login Panels
        int breiteTextFeldBenutzerAnm = 200;
        int hoeheTextFeldBenutzerAnm = 30;
        
        //Größeninformationen für das TextFeld von Benutzername des Registrierungs Panels
        int breiteTextFeldBenutzerReg = 200;
        int hoeheTextFeldBenutzerReg = 200;
        
        //Größeninformationen für das PasswortFeld von Login Panels
        int breitePasswortFeldLogin = 200;
        int hoehePasswortFeldLogin = 30;
        
        //Größeninfomrationen für das PasswortFeld vom Registrierungs Panels
        int breitePasswortFeldReg = 200;
        int hoehePasswortFeldReg = 30;
        
        
        
        
        //Größe für die Oberfläche
        oberflaeche.setSize(new Dimension(breiteOberflaeche, hoeheOberflaeche));       
        
        //Größe für das Loginfenster
        loginAnmeldung.setSize(new Dimension(breiteLoginAnmeldung, hoeheLoginAnmeldung));
        
        //Größe für das BenutzerPanel
        benutzerReg.setSize(new Dimension(breiteBenutzerReg, hoeheBenutzerReg));
        
        //Größe für das Textfeld Benutzername vom Anmeldungsfenster
        benutzerNameAnmeldung.setPreferredSize(new Dimension(breiteTextFeldBenutzerAnm, hoeheTextFeldBenutzerAnm));
        
        //Größe für das TextFeld Benutzername vom Registrierungsfenster
        benutzerNameRegistrierung.setPreferredSize(new Dimension(breiteTextFeldBenutzerReg, hoeheTextFeldBenutzerReg));
        
        //Größe für das PasswordField vom Anmeldungsfenster
        passwortAnmeldung.setPreferredSize(new Dimension(breitePasswortFeldLogin, hoehePasswortFeldLogin));
        
        //Größe für das PasswordFeld vom Registrierungsfenster
        passwortRegistrieren.setPreferredSize(new Dimension(breitePasswortFeldReg, hoehePasswortFeldReg));
        
    }
    
    
    
}

Für den Rahmen der einzelnen Panels habe ich die Klasse Rahmen erstellt:
Java:
public class Rahmen {

    public Rahmen(TitledBorder loginAnmeldungRahmen, TitledBorder benutzerRegistrierenRahmen, JPanel loginAnmeldung, JPanel benutzerReg) {
        
        int anmeldungsgrößeX = 400;
        int anmeldungsgrößeY = 400;
        
        //Gleiche Größen, für den Rahmen des Login Panels und des RegistrierungsPanel
        int größeRahmenAnmeldungRegX = 100;
        int größeRahmenAnmeldungRegY = 100;
        
        //den Rahmen setzen für das Login - Anmeldungs Panel
        loginAnmeldung.setBounds( größeRahmenAnmeldungRegX, größeRahmenAnmeldungRegY, anmeldungsgrößeX, anmeldungsgrößeY );
        loginAnmeldungRahmen = BorderFactory.createTitledBorder("Login-Anmeldung");
        loginAnmeldung.setBorder(loginAnmeldungRahmen);
        loginAnmeldung.setBackground(Color.WHITE);
        
        //den Rahmen setzen für neue Benutzer
        benutzerReg.setBounds( größeRahmenAnmeldungRegX, größeRahmenAnmeldungRegY, anmeldungsgrößeX, anmeldungsgrößeY );
        benutzerRegistrierenRahmen = BorderFactory.createTitledBorder("Benutzer neu registrieren");
        benutzerReg.setBorder(benutzerRegistrierenRahmen);
        benutzerReg.setBackground(Color.WHITE);
    }
    
    
    
}


und schließlich noch für die JFrameEigenschaften:
Java:
public class JFrameEigenschaften {

    public JFrameEigenschaften(JFrame oberflaeche, JDesktopPane desktop) {
        
       oberflaeche.getContentPane().add(desktop);
        oberflaeche.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        oberflaeche.setTitle("Login");
        oberflaeche.setVisible(true);
    }
    
    
    
}
 
Du solltest dir mal das CardLayout ansehen, diesem kannst du ähnlich wie auch einem Kartendeck
mehre JPanel hinzufügen , die du dann entweder über ein JTabbedane / eine JCoboBox oder einfach über Buttons ansteuern
Damit kannst du ähnlich wie man es auch vom Install shield kennt nacheinander alle Informationen die nötig sind erfassen.

Hier mal ein Kleines sehr einfach gehaltenes Beispiel mit einem MouseListener, starte es und klick einfach mal in das Fenster

Java:
package tests;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class CardPreview implements MouseListener{

	JFrame frame;
	
	JPanel contentPane;
	JPanel paneOne, paneTwo;
	
	public CardPreview() {
		
		frame = new JFrame("CardLayout");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setSize(500,300);
		
		
		
		contentPane = new JPanel(new CardLayout());
		contentPane.addMouseListener(this);
		
		
		paneOne = new JPanel();
		paneOne.setBackground(Color.BLUE);
		
		paneTwo = new JPanel();
		paneTwo.setBackground(Color.CYAN);
		
		contentPane.add(paneOne, "");
		contentPane.add(paneTwo, "");
		
		frame.add(contentPane);
		
		frame.setVisible(true);
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		CardLayout c = (CardLayout) contentPane.getLayout();
		
		if (arg0.getButton() == MouseEvent.BUTTON1) {
			c.next(contentPane);
		}
		
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	public static void main(String[] args) {
		new CardPreview();
	}
}

Ansonsten schau mal eins meiner Topics an welches ich im Anfänger-Bereich gepostet habe , dort hatte ich ein Problem mit dem hinzufügen von Listenern zu lokalen Komponenten, ich verwende da ebenfalls das CardLayout für etwas ähnliches,

da habe ich auch eine Lösung dazu gepostet 🙂

Hier mal der Link :

Listener für Lokale Komponenten
 
Zuletzt bearbeitet:
Danke euch. Ich habe nun versucht das von euch umzusetzen.

Ich habe nun nicht mehr alles in einer Funktion, sondern in mehreren und auch mehreren Klassen. Jedoch zeigt es nun gar keine Elemente mehr an.

Meine Main Klasse ist nun klein gehalten (sie ruft nur die init Funktion der Klasse Initialisierung auf)

Leider muss ich es direkt sagen: Dieser Code ist im Gegensatz zum 2.Post schlechter. :autsch:
Das Problem war ja neben den "_" in den Bezeichnern nur das du alles in einer Methode (bzw. im Konstruktor stehen hattest).
Wenn du dann deine GUI mal ändern willst wird der Konstruktor/Methode immer immer länger und du musst erstmals suchen wo du welche Komponente hinzufügst.

Bleib am Anfang am besten bei 1 Klasse/Fenster und teile die Erstellung der Komponenten nur in Methoden auf. Sollten deine GUIs in Zukunft komplexer werden wirst du dir entsprechende Möglichkeiten aneignen können es weiter aufzuteilen.

Was ist auszusetzen an deinem Code?
Du erstellst in einer Klasse alle Komponenten der Oberfläche das wird mit der Zeit unendlich lang und unübersichtlich.
Und dann gibt es wieder X weitere Klassen die alle jeweils im Konstruktor nur "Eigenschaften" der Komponenten setzen. Was ist wenn du neue hinzufügst oder alte löschen willst? Du musst an X Klassen Änderungen vornehmen da du jeder mehr/weniger Parameter übergibst.

Noch dazu ist das Ganze keine OOP ... JFrameEigenschaften stellt kein Objekt dar, genauso wenig wie BenutzerAnordnung. Aber JFrame bzw. JPanel im Gegensatz schon.
 

Zurück
Oben