Programm soll warten bis eine Passwort eingabe gemacht wurde.

RedFox

Mitglied
Moin,

ich hab ne JTextPane und nen JTextField, die is so wie ne Konsole aufgebaut, dort will ich zb. eine passwort-abfrage machen, und das soll so gehn:
Text wird in die Konsole geschrieben, was der Benutzer machen soll, und dann gehts erst weiter wenn der Text für das Passwort geschrieben wurde.

Mein Problem liegt darin, das der Programm-ablauf einfach weiter läuft, obwohl er warten soll.

Form für die JTextPane und JTextField:
Java:
public class LoadingForm extends JFrame {

    TextPaneManager man;

    public LoadingForm() {
        [...]
        man = new TextPaneManager(textPane_console);
        input_console.addKeyListener(new InputListener());
        input_console.requestFocus();

        checkPassword();
    }

    private class InputListener implements KeyListener {

        public void keyTyped(KeyEvent e) {
        }

        public void keyPressed(KeyEvent e) {
            //Text wird in die Konsole geschrieben.
            if(e.getKeyCode() == KeyEvent.VK_ENTER && !input_console.getText().isEmpty()) {
                man.insertString(input_console.getText());
            }

        }

        public void keyReleased(KeyEvent e) {
        }

    }

    private void checkPassword() {
        String pw = man.getString("Passwort für das Starten des Systems:");
        // <---- Hier soller warten bis nen return value von getString kommt
        if(pw.equals("123")) {
            man.insertString("richtig");
        } else {
            man.insertString("falsch");
        }
        man.insertString("fertig");
    }              

}

TextPaneManager:
Java:
public class TextPaneManager {

    public static final String BREAK = System.getProperty("line.separator");

    private Document doc;
    private int insertType = 0; // Wenn 0 normaler eintrag, wenn 1 wird der text eine antwort auf die frage sein, also das passwort
    private String returnText = ""; // Das passwort

    public TextPaneManager(JTextPane tP) {
        doc = tP.getDocument();
        tP.getDocument().addDocumentListener(new TextPaneListener());
    }

    public String getString(String text) {
        try {
            doc.insertString(doc.getLength(), text+BREAK, null); // Die frage posten
            insertType = 1; // insertType auf 1 setzen
            new Thread() {
                @Override
                public void run() {
                    boolean run = true;
                    while(run) { // so lange laufen bis der text gesendet wurde
                        if(!returnText.isEmpty()) {
                            run = false;
                        }
                    }
                    interrupt();
                }
            }.start();
        } catch(BadLocationException ex) {
        }

        return returnText;
    }

    public void insertString(String text) {
        try {
            doc.insertString(doc.getLength(), text+BREAK, null);
        } catch(BadLocationException ex) {
        }
    }

    public class TextPaneListener implements DocumentListener {

        public void insertUpdate(DocumentEvent e) {
            if(insertType == 1) { // wenn insertType 1 ist, also wenn das pw gesendet wurde dann:
                try {
                    returnText = e.getDocument().getText(e.getOffset(), e.getLength()); // das pw wurde eingegeben und wird zurück gegeben.
                    insertType = 0; // insertType wieder auf normal setzen
                } catch(BadLocationException ex) {
                }
                returnText = "";
            }
        }

        public void removeUpdate(DocumentEvent e) {
        }

        public void changedUpdate(DocumentEvent e) {
        }

    }

}

So bald ich starte kommt das:
Java:
Passwort für das Starten des Systems:
falsch
fertig

Er wartet also nicht.
 
Zuletzt bearbeitet:
Naja, wenn du einen neuen Thread startest und dort dein "Warten" erledigst, ist es doch klar, dass er im Hauptstrang NICHT wartet? Die Methode getString wird ja dann sofort beendet... ?!
 
Ja ich weiß, aber wenn ich keinen Thread mache, Friert das ganze Programm ein, wegen dem while, und kann somit keine Eingabe machen.

Ich weiß nicht wie ichs anders Lösen soll.
 
Mit einer do - while Schleife arbeite:

Java:
public static void main(String[] args) {
		String password = "password";
		
		Scanner scanner = new Scanner(System.in);
		
		String eingabePassword = null;
		
		
		do {
			System.out.print("Bitte Passwort eingeben: ");
			eingabePassword = scanner.nextLine();
			
			
		} while (!password.equals(eingabePassword));
		System.out.println("Passwort korrekt, Programm startet - have fun!");
		//... und los gehts
		
	}

Kannst du bei dir genauso umsetzen.
 
Nein das wird ja in die Richtige Konsole gemacht, ich will aber mein eigenen benutzen.

EDIT:
Achso du meinst so aufbaun?
hmm... wie soll das denn gehn..
Mit der while stop doch mein Programm-ablauf.
 
Zuletzt bearbeitet:
wie wärs wenn du einen true oder false zurückgibst und je nachdem den thread neu startest und die anderen threads solange in na endlos schleife laufen und erst bei true weiter laufen
 

Zurück
Oben