Schwer zu beschreibendes Problem mit JFrame oder JButton

Bud01

Mitglied
Hallo liebes Forum!

Und zwar, habe ich einen Loginbildschirm, aus dem Leereingaben mit der Methode checkForEmptyInputs herausgefiltert werden sollen.
Java:
	public void buildLoginWindow(HauptGui hauptGui) {
		// login Pop-up
		JTextField name = new JTextField();
		JPasswordField pwd = new JPasswordField();

		Object[] message = { "Bitte Name und Passwort eingeben!\n", name, pwd };

		int login = JOptionPane.showConfirmDialog(null, message,
				"Database-Manager 3000 - Login", JOptionPane.OK_CANCEL_OPTION,
				JOptionPane.QUESTION_MESSAGE);

		checkForEmptyInputs(hauptGui, name, pwd);

	}

	public void checkForEmptyInputs(HauptGui hauptGui, JTextField name,
			JPasswordField pwd) {
		if (name.getText().length() == 0 || pwd.getPassword().length == 0) {
			buildWarningFrame(hauptGui);
		}

	}
Wenn eine Leereingabe erfolgt ist, springt ein JFrame auf, welches eine Warnung(JLabel) und 2 Buttons besitzt. Die Buttons haben jeweils einen ActionListener. Der Abbrechen-Button beendet das Programm und beim Ok-Button soll sich die Warnung schließen und es soll zum Login-Bildschirm gesprungen werden. Jetzt zu meinem Problem:
1. Wenn ich in der Warnung Ok klicke schließt sich die Warnung nicht, der Login-Bildschirm wird nur drübergelegt.
2.Und jetzt wird's schwer zu beschreiben. Wenn ich im Login-Bildschirm eine Leereingabe mache, springt ja die Warnung auf. Wenn ich dann in der Warnung Ok klicke, springt, wie in 1. beschrieben, der Login-Bildschirm auf, aber, wenn ich in diesem Loginbildschirm nun meine Eingaben mache, dann springt es nicht zum nächsten Fenster, dessen Code ich hier nicht gepostet habe. Sondern wieder zur Warnung, welche ich in dieser Situation nicht mal mehr mit dem Abbrechen-Button schließen kann.
Java:
		public void buildWarningFrame(final HauptGui hauptGui) {
		hauptGui.frame = new JFrame("Database-Manager 3000");
		hauptGui.frame.setBounds(100, 100, 300, 150);
		hauptGui.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		hauptGui.frame.getContentPane().setLayout(null);
		hauptGui.frame.setLocationRelativeTo(null);

		JLabel lblZugriffVerweigert = new JLabel("Zugriff verweigert");
		lblZugriffVerweigert.setHorizontalAlignment(SwingConstants.CENTER);
		lblZugriffVerweigert.setBounds(10, 11, 264, 56);

		hauptGui.frame.getContentPane().add(lblZugriffVerweigert);
		
		
		JButton btnOk = new JButton("Ok");
		btnOk.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				
				buildLoginWindow(hauptGui);
				hauptGui.frame.dispose();
				}
			});
		btnOk.setBounds(10, 78, 89, 23);
		hauptGui.frame.getContentPane().add(btnOk);
		

		JButton btnAbbrechen = new JButton("Abbrechen");
		btnAbbrechen.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {			
			hauptGui.frame.dispose();
			}
		});		
		btnAbbrechen.setBounds(174, 78, 100, 23);
		hauptGui.frame.getContentPane().add(btnAbbrechen);

	}

Ich bin schon am Haare raufen, aber irgendwie will es nicht werden.
Ich hoffe einer von euch kann mir helfen.
Danke im Voraus!
 
Du springst von einer Methode in die Nächste. Das würde ich korrigieren. Einerseits ist es nicht wiederverwendbar, andererseits sorgt es für Durcheinander. Nimm lieber eine Methode die durchläuft (so als zusammengebauter Programmablauf) und diese ruft einfach die restlichen Methoden auf und handled ihren Rückgabewert.

Nebenbei finde ich es komisch, das der Loginscreen aus einen JOptionPane besteht und die Fehlermaske so eine aufwändige Methode benutzt. ^^
 
Die Methoden habe ich so "zerpflückt" wegen Klassen/Methodenentwurf nach Zuständigkeit. Ich wollte eben, dass eine Methode genau für ein was zuständig ist und ich glaube das sollte passen. Es hapert, so wie ich rausgefunden habe daran:
Wenn ich die Prozedur, die in 2. beschrieben habe durchführe und zum 2. mal durch die checkForEmptyInputs() laufe, scheint es die if() nicht zu beachten. Ich kann mir zumindest nicht vorstellen, warum sonst, trotz Eingabe, kein Login passiert.
Obwohl, der kann ja nicht einfach so etwas überspringen....ach ich weiß es nicht -.-
 
Die die Zuständigkeit hat etwas damit zu tun, das die Methoden sich wirr gegenseitig aufrufen anstatt Rückgabewerte zu liefern oder Listener zu benutzen (sofern das bei der Struktur sinnvoll wäre.)

Wie rufst du denn das nächste Fenster auf?
 
Na da poste ich mal noch die HauptGui:
Java:
package main;
 
import java.awt.EventQueue;
 
public class HauptGui {
 
    JFrame frame;
    private LoginChecker checker;
 
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    HauptGui window = new HauptGui();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
 
    /**
     * Create the application.
     */
    public HauptGui() {
        
        checker = new LoginChecker();
        initialize();
    }
 
    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setSize(800, 600); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Database-Manager 3000");
        frame.setLocationRelativeTo(null);
 
      
        JTabbedPane tabLeiste = new JTabbedPane();
 
        JPanel angestellteTab = new JPanel();
        tabLeiste.addTab("Angestellte", angestellteTab);
 
        JPanel produkteTab = new JPanel();
        tabLeiste.addTab("Produkte", produkteTab);
 
        JPanel kundenTab = new JPanel();
        tabLeiste.addTab("Kunden", kundenTab);
 
        JPanel zuliefererTab = new JPanel();
        tabLeiste.addTab("Zulieferer", zuliefererTab);
 
        JPanel einnahmenTab = new JPanel();
        tabLeiste.addTab("Einnahmen", einnahmenTab);
 
        JPanel ausgabenTab = new JPanel();
        tabLeiste.addTab("Ausgaben", ausgabenTab);

        frame.getContentPane().add(tabLeiste);
        
 
        checker.buildLoginWindow(this);
    }}
Meine Idee war. vor die HauptGui den LoginScreen vorzuschalten und eben bei Leereingabe im Login soll die Warnung kommen, wo man entweder abbrechen oder nochmal versuchen kann sich einzuloggen.
 
Ich denke der Grund für die Probleme ist, dass du in buildWarningFrame() das JFrame der Gui mit der Warnung überschreibst. Dadurch wird nach den richtigen Angaben wohl auch das JFrame, in dem jetzt das JFrame mit der Warnung steht angezeigt.
Denke das andere Problem hängt auch damit zusammen.
 

Zurück
Oben