Swing JTextField auslesen Klassen übergreifend

Soloeco

Aktives Mitglied
Hey,
ich habe in de noch folgenden Code eine Art Passwort Fenster erstellt und mein nächstes Ziel ist es nun erst einmal, dass wenn man einen bestimmten Usernamen und ein bestimmtes Passwort eingibt und dann auf "OK" klickt das Fenster geschlossen und ein neues geöffnet wird.
Das mit den Fenstern an sich bekomme ich hin, nur ich weiß nicht ganz wie ich nun die Eingabe des JTextFields auslesen und vergleichen kann mit dem Usernamen/Passwort was ich vorher festgelegt habe.

Das hier ist das Fenster was sich zuerst öffnet mit dem Username etc.:

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;

public class DemoFrame extends JFrame {
   
    public DemoFrame(ActionListener listener) {
        setTitle("Ein Fenster mit einem Layout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
       
        //title
        JLabel titleLabel = new JLabel("Password Access");
        add(titleLabel, BorderLayout.NORTH);
        titleLabel.setHorizontalAlignment(JLabel.CENTER);
        titleLabel.setBorder(BorderFactory.createEmptyBorder(20,0,20,0));
       
        //main
        JPanel main = new JPanel();
        add(main, BorderLayout.CENTER);
        main.setLayout(new GridLayout(2,2));
       
        JPanel p1 = new JPanel();
        JPanel p2 = new JPanel();
        main.add(p1);
        main.add(p2);
       
        JLabel l1 = new JLabel("Username:");
        JTextField tf1 = new JTextField(12);
        p1.add(l1);
        p1.add(tf1);
       
        JLabel l2 = new JLabel("Password:");
        JTextField tf2 = new JTextField(12);
        p2.add(l2);
        p2.add(tf2);
       
        //buttons
        JPanel buttons = new JPanel();
        add(buttons, BorderLayout.SOUTH);
       
        JButton okButton = new JButton("OK");
        JButton closeButton = new JButton("CLOSE");
       
        buttons.add(okButton);
        buttons.add(closeButton);
       
        okButton.addActionListener(listener);
        closeButton.addActionListener(listener);
       
        //left side panel
        JLabel leftSideLabel = new JLabel("<html>Denke an ein sicheres Passwort!<p/>Nur so kann die Sicherheit gewährleistet werden.<p/>Nutzen sie auch Sonderzeichen.</html>");
        add(leftSideLabel, BorderLayout.WEST);
       
        //right side panel
        JLabel rightSideLabel = new JLabel("<html>Nur ein leeres Label zum Testen.<p/>Wollte mal gucken wie das dann so aussieht.</p> Also so im Ganzen meine ich.</html>");
        add(rightSideLabel, BorderLayout.EAST);
       
        pack();
    }
}

Und das hier ist der Code wo ich festlege was passieren soll:

Java:
import javax.swing.*;
import java.awt.event.*;

public class Action implements ActionListener {
   
    private DemoFrame frame;
    private MainFrame mainFrame;
   
    public void startGUI() {
        frame = new DemoFrame(this);
        frame.setVisible(true);
    }
   
    public void startGUI2() {
        mainFrame = new MainFrame(this);
        mainFrame.setVisible(true);
    }
   
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
       
        if (command.equals("OK")) {
            System.out.println("Your password is correct!");
            frame.dispose();
            startGUI2();   
        }
        else if (command.equals("CLOSE")) {
            frame.dispose();
        }
    }
}

Dazu habe ich noch eine Klasse "Launcher" die den Konstruktor enthält und eine Klasse "MainFrame" für das zweite Fenster, dass nach korrekter Eingabe geöffnet werden soll.

Ich habe dazu bereits mit getText().equal("passwort") versucht nur bin ich da gescheitert 😀
Würde mich freuen wenn mir jemand dabei weiter helfen kann!
Freundliche Grüße
 
Ich stehe wohl gerade auf dem Schlauch, wie denn global machen? Und wie geht es dann weiter?
 
Zuletzt bearbeitet:
Code:
public class DemoFrame extends JFrame {
      private JTextField tf2 = new JTextField(12);
  
     public DemoFrame(ActionListener listener) {
....


public String getPassWord(){
    return tf2.getText();
}
Du solltest die benötigten Textfelder als Klassen Variabel anlegen. Und eine Gettermethode zur Verfügung stellen.
 
Also die Klassen Variablen habe ich nun angelegt. In welche Klasse müssen denn nun die Gettermethoden? Aktuell habe ich die in der DemoFrame Klasse, doch dann bekomme ich in der Action Klasse den Fehler "The method getUserName() is undefined for the type Action".
 
Code:
@Override
     public void actionPerformed(ActionEvent e) {
         String command = e.getActionCommand();
       
         if (command.equals("OK")) {

         String enterdPass = frame.getPassWord();
        ...
So könntest du dann auf den eingegebenen Text zugreifen.
Tipp: benutze bessere Namen für Deine Variablen.
z.B. JTextField password statt tf2.
Das macht Deinen Code viel leserlicher.
🙂
 
Da sich das Textfield in Demoframe befindet gehört die Getter natürlich in diese Klasse, weil du ja auf dessen Member das Textfield zugreifen willst.
Wichtig mache sie public
 
Perfekt, danke an euch beide und auch für deinen Tipp mit den Variablen Namen @Blender3D ! Letztendlich klappt es nun nun folgendem Code:

Java:
    //action command password access
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
       
        if (command.equals("OK")) {
            String userName = frame.getUserName();
            if (userName.equals("hs-owl")) {
                System.out.println("Your Username is correct!");
                frame.dispose();
                startGUI2();
            }
            else {
                System.out.println("Username incorrect!");
            }
        }
        else if (command.equals("CLOSE")) {
            frame.dispose();
        }
    }
 
Moin,
Letztendlich klappt es nun nun folgendem Code:
Java:
    //action command password access
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
      
        if (command.equals("OK")) {
            String userName = frame.getUserName();
            if (userName.equals("hs-owl")) {
                System.out.println("Your Username is correct!");
                frame.dispose();
                startGUI2();
            }
            else {
                System.out.println("Username incorrect!");
            }
        }
        else if (command.equals("CLOSE")) {
            frame.dispose();
        }
    }
Mal dumm gefragt, da sowohl anfangs als auch hier vom Passwort die Rede ist:
Du startest also das GUI sobald 'nur' der korrekte Username eingegeben wird 😱 ??

Gruß Klaus
 
Hallo,
@VfL_Freak Nein nicht ganz,ich starte es wenn Username und Password richtig eingegeben wurden, also beides muss richtig sein.

@HStein52 Ja ich weiß es gibt ein spezielles Textfeld für Passwörter in Swing, das war bisher einfach so zum ausprobieren.
 
Achso entschuldige, zu dem Zeitpunkt hatte ich es nur für den Username gemacht. Hier aber nun auch mit dem Password:

Java:
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
      
        if (command.equals("OK")) {
            String userName = frame.getUserName();
            String userPassWord = frame.getPassWord();
            if (userName.equals("hs-owl") && userPassWord.equals("abc")) {
                frame.dispose();
                startGUI2();
            }
            else {
                System.out.println("Username incorrect!");
            }
        }
        else if (command.equals("CLOSE")) {
            frame.dispose();
        }
 
Moin,

da wir nicht wissen können, was frame.getUserName() und frame.getPassWord() machen:
- was passiert denn?
- sind userName und userPassWord korrekt gefüllt?
- wird etwa "Username incorrect!" zurückgegeben?
- BTW: was wird wohl ausgegeben, wenn das Passwort nicht korrekt ist?

Fragen über Fragen ...

Gruß Klaus
 
Also eigentlich ging es in diesem Beitrag nur um meine Frage, wie man ein JTextField auslesen kann (Klassen übergreifend) und die Antwort gibt es ja bereits.

public String getPassWord(){
return tf2.getText();
}

Mit den beiden Methoden frame.getUserName() und frame.getPassWord() kann ich die beiden JTextFields, die ich erzeugt hab in GUI1, auslesen und bekomme eine Rückgabe geliefert.

Java:
    public String getUserName() {
        return tf1.getText();
    }
    public String getPassWord() {
        return tf2.getText();
    }

Damit ich diese Methoden auch in einer anderen Klasse nutzen kann habe ich die JTextFields, in der Klasse DemoFrame, global gesetzt mit:

Java:
private JTextField tf1 = new JTextField(12);
    private JTextField tf2 = new JTextField(12);

Nachdem ich die JTextFields ausgelesen habe kann ich nun die Eingabe mit dem gesetzten Username und Password vergleichen, falls die Eingabe korrekt ist wird GUI1 geschlossen und GUI2 (ein neues Fenster) gestartet. Falls dies nicht der Fall ist, also eine der beiden Eingaben falsch ist, wird ein Fehler ausgegeben. Ja mir ist bewusst, dass dort in meinem Code bisher nur "Username incorrect" ausgegeben wird, den Rest, falls entweder eine der beiden Eingaben oder sogar beide falsch eingegeben werden, muss ich noch passend einfügen. Aber wie gesagt, eigentlich ging es mir nur um die Frage wie man das TextField ausliest.
 

Zurück
Oben