JTextField getText() gibt immer null zurück

Lit-Web

Aktives Mitglied
Guten Morgen Leute,

es geht immer noch um meinen Login.

Und zwar übergebe ich bzw. will ich aus zwei Textfeldern den Inhalt über getText() als Paramter an einen Button ActionListner übergeben.
Ich habe noch eine Klasse LoginCheck die, die eingegebenen Daten auswerten soll.
In dieser Klasse mache ich eine Testausgabe ob meine Parameter ankommen, das tun sie, aber als null. Heißt es steht nicht drin was drin stehen soll.

Meine Gui.
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

public class LoginGuiElement extends JPanel {
	
	protected JLabel lblLogName;
	protected JLabel lblPwd;
	protected GridBagLayout pnlLoginLayout;
	protected JTextField loginNameField;
	protected JTextField loginPwdField;
	protected JButton loginButton;
	protected String vName;
	protected String nName;
	
	/**
	 * 
	 * Konstruktor gibt das fertige Panel mit allen Loginelementen zurück
	 * 
	 * */
	public LoginGuiElement () {
		this.setSize( 500, 500 );
		this.setLayout( this.createLogPanelLayout() );
		this.setPreferredSize( new Dimension( 500, 150 ) );
		this.setBackground( Color.white );
		this.add( this.returnLblLogName() );
		this.add( this.returnLblPwd() );
		this.add( this.returnNameField() );
		this.add( this.returnPwdField() );
		this.add( this.returnBtnLogin() );
		vName = this.returnNameField().getText();
		nName = this.returnPwdField().getText();
		System.out.println( vName );
		System.out.println( nName );
		this.setVisible( true );
	}
	
	/**
	 * 
	 * Label Loginname
	 * 
	 * */
	protected JLabel returnLblLogName () {
		lblLogName = new JLabel();
		Font f = new Font( "Arial", Font.BOLD, 12 );
		lblLogName.setText( "Loginname" );
		lblLogName.setSize( 120, 20 );
		lblLogName.setFont( f );
		lblLogName.setForeground( Color.black );
		lblLogName.setLocation( 10, 40 );
		lblLogName.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( lblLogName, gbc );
		return lblLogName;
	}
	
	/**
	 * 
	 * Label Passwortext
	 * 
	 * */
	protected JLabel returnLblPwd () {
		lblPwd = new JLabel();
		Font f = new Font( "Arial", Font.BOLD, 12 );
		lblPwd.setText( "Passwort" );
		lblPwd.setSize( 120, 20 );
		lblPwd.setFont( f );
		lblPwd.setForeground( Color.black );
		lblPwd.setLocation( 10, 40 );
		lblPwd.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( lblPwd, gbc );
		return lblPwd;
	}
	
	/**
	 * 
	 * Eingabefeld für den Loginnamen
	 * 
	 * */
	protected JTextField returnNameField () {
		loginNameField = new JTextField();
		loginNameField.setPreferredSize( new Dimension( 120, 20 ) );
		loginNameField.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 1;
		gbc.gridy = 0;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 120;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( loginNameField, gbc );
		return loginNameField;
	}
	
	/**
	 * 
	 * Eingabefeld für die Passworteingabe
	 * von hier aus soll der Focus Event ausgelöst werden wenn der Focus des Feldes verlassen wird
	 * 
	 * */
	protected JTextField returnPwdField () {
		loginPwdField = new JTextField();
		loginPwdField.setPreferredSize( new Dimension( 120, 20 ) );
		loginPwdField.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 1;
		gbc.gridy = 1;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 120;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( loginPwdField, gbc );
		return loginPwdField;
	}
		
	/**
	 * 
	 * Login Button der einen Event feuert um sich ins System einzuloggen
	 * 
	 * */
	protected JButton returnBtnLogin () {
		loginButton = new JButton();
		loginButton.setPreferredSize( new Dimension( 120, 20 ) );
		loginButton.setText( "Login" );
		loginButton.addActionListener( new BtnLoginAction( this, vName, nName ) );
		loginButton.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 1;
		gbc.gridy = 2;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 120;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( loginButton, gbc );
		return loginButton;
	}
	
	/**
	 * 
	 * Layoutmanger wird ans Panel übergeben
	 * 
	 * */
	protected GridBagLayout createLogPanelLayout () {
		pnlLoginLayout = new GridBagLayout();
		return pnlLoginLayout;
	}
}

Meine Login Check.
Java:
import java.sql.*;

public class LoginCheck {
	
	protected Connection dbCon;
	protected Statement stmt;
	protected boolean logged;
	
	public LoginCheck ( DatabaseConnect pDbCon ) {
		dbCon = pDbCon.connectToDb();
		
		try {
			stmt = dbCon.createStatement();
		} catch ( SQLException e ) {
			e.printStackTrace();
		}
	}
	
	public boolean login ( String pVorname, String pNachname ) {
		try {
			int cntLog = 0;
			
			String sqlLog = "SELECT Count(*) As cntLog, vorname, nachname FROM tsv_mitglieder WHERE" +
					" vorname = '" + pVorname + "' AND" +
					" nachname = '" + pNachname + "'";
			ResultSet resultRows = stmt.executeQuery( sqlLog );
			
			while( resultRows.next() ) {
				cntLog = resultRows.getInt( "cntLog" );
			}
			
			System.out.println( cntLog );
			System.out.println( pVorname );
			System.out.println( pNachname );
			
			if ( cntLog > 0 ) {
				logged = true;
			} else {
				logged = false;
			}
			
		} catch( SQLException e ) {
			e.printStackTrace();
		}
		
		return logged;
	}
}

Meine Action Klasse
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class BtnLoginAction implements ActionListener {
	
	protected JPanel logPanel;
	protected String logName;
	protected String logPwd;
	protected LoginCheck ckl;
	
	public BtnLoginAction ( JPanel pLogPanel, String pLogName, String pLogPwd ) {
		logPanel = pLogPanel;
		logName = pLogName;
		logPwd = pLogPwd;
		ckl = new LoginCheck( new DatabaseConnect( "ConfigFiles/mysqlProperties.txt" ) );
	}
	
	public void actionPerformed ( ActionEvent pEvent ) {
		
		if ( ckl.login( logName, logPwd ) == true ) {
			logPanel.setVisible( false );
		}
	}
}

Ich bin der Meinung das, dies alles so sein müsste, aber das Programm sagt mir etwas anderes. Woran liegt, was mache ich da falsch?

Vielen Dank für eure Zeit und Hilfe.

Mfg Lit-Web
 

Meru

Bekanntes Mitglied
Du machst mehrere Fehler in deinem Programm.

[Java]
this.add(this.returnPwdField()); // Hier wird BtnLoginAction instanziiert
this.add(this.returnBtnLogin());
vName = this.returnNameField().getText();
nName = this.returnPwdField().getText();
System.out.println(vName);
System.out.println(nName);
[/code]
Du rufst die Methode this.returnPwdField() auf. In dieser instanziierst du diese Klasse und reichst die beiden Strings mit hinein. Diese sind aber zu diesem Zeitpunkt noch NULL. Erst durch die Zeilen > vName = this.returnNameField().getText(); < schreibst du einen Wert hinein und dann sind sie ungleich null.
Aber vorher hast du sie als NULL übergeben.

Und bedenke, wenn du Objekte einer anderen Instanz gibst, diese zu diesem Zeitpunkt noch null sind und erst später instanziiert werden, dann ist das Objekt in der anderen Instanz immernoch null, WEIL, du übergibst ja eine Referenz und diese zeigt auf null. Jetzt wird deine Variable/Objekt instanziiert und bekommt eine neue Referenz. Das andere Objekt hat aber noch immer die Referenz von vorhin, null.



Beachte weiterhin, dass jedes mal, wenn du "this.returnPwdField()" aufrufst, du ein neues TextField instanziierst.
In deinem Programm rufst du die Mehtode 2 mal auf. Einmal um es auf die GUI zu packen und einmal, um deine Variable zu befüllen. Beides sind aber nicht mehr die gleichen Objekte. Deren Inhalte können demzufolge unterschiedlich sein.

Bsp:

Java:
JTextField field = this.returnPwdField();
field.setText("hallo");
nName = this.returnPwdField().getText(); // hier steht jetzt nicht hallo drin

in nName seht nun NICHT "hallo", so wie du es wahrscheinlich vermutest. Grund ist, dass du in this.returnPwdField() jedesmal "new" machst.



Besser wäre demzufolge folgendes:
Java:
protected JTextField returnNameField() {
	if (this.loginNameField == null){
		loginNameField = new JTextField();
		loginNameField.setPreferredSize(new Dimension(120, 20));
		loginNameField.setVisible(true);
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 1;
		gbc.gridy = 0;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 120;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints(loginNameField, gbc);
	}
	return loginNameField;
}
Dadurch bekommst du immer die gleiche Instanz und diese hat immer und überall den gleichen Inhalt
 
Zuletzt bearbeitet:

Lit-Web

Aktives Mitglied
Ich kann so langsam nachvollziehen was du mir da sagen willst. Habe den Code auch mal so andepasst. Es wird also erst ein Object erzeugt wenn in der Variablen dazu null drin steht.

Hier mein codeauszug jetzt.

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

public class LoginGuiElement extends JPanel {
	
	protected JLabel lblLogName;
	protected JLabel lblPwd;
	protected GridBagLayout pnlLoginLayout;
	protected JTextField loginNameField;
	protected JTextField loginPwdField;
	protected JButton loginButton;
	protected String vName;
	protected String nName;
	
	/**
	 * 
	 * Konstruktor gibt das fertige Panel mit allen Loginelementen zurück
	 * 
	 * */
	public LoginGuiElement () {
		this.setSize( 500, 500 );
		this.setLayout( this.createLogPanelLayout() );
		this.setPreferredSize( new Dimension( 500, 150 ) );
		this.setBackground( Color.white );
		this.add( this.returnLblLogName() );
		this.add( this.returnLblPwd() );
		this.add( this.returnNameField() );
		this.add( this.returnPwdField() );
		this.add( this.returnBtnLogin() );
		vName = this.returnNameField().getText();
		nName = this.returnPwdField().getText();
		System.out.println( vName );
		System.out.println( nName );
		this.setVisible( true );
	}
	
	/**
	 * 
	 * Label Loginname
	 * 
	 * */
	protected JLabel returnLblLogName () {
		lblLogName = new JLabel();
		Font f = new Font( "Arial", Font.BOLD, 12 );
		lblLogName.setText( "Loginname" );
		lblLogName.setSize( 120, 20 );
		lblLogName.setFont( f );
		lblLogName.setForeground( Color.black );
		lblLogName.setLocation( 10, 40 );
		lblLogName.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( lblLogName, gbc );
		return lblLogName;
	}
	
	/**
	 * 
	 * Label Passwortext
	 * 
	 * */
	protected JLabel returnLblPwd () {
		lblPwd = new JLabel();
		Font f = new Font( "Arial", Font.BOLD, 12 );
		lblPwd.setText( "Passwort" );
		lblPwd.setSize( 120, 20 );
		lblPwd.setFont( f );
		lblPwd.setForeground( Color.black );
		lblPwd.setLocation( 10, 40 );
		lblPwd.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( lblPwd, gbc );
		return lblPwd;
	}
	
	/**
	 * 
	 * Eingabefeld für den Loginnamen
	 * 
	 * */
	protected JTextField returnNameField () {
		if ( this.loginNameField == null ) {
			loginNameField = new JTextField();
			loginNameField.setPreferredSize( new Dimension( 120, 20 ) );
			loginNameField.setVisible( true );
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = 1;
			gbc.gridy = 0;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			pnlLoginLayout.setConstraints( loginNameField, gbc );
		}
		return loginNameField;
	}
	
	/**
	 * 
	 * Eingabefeld für die Passworteingabe
	 * von hier aus soll der Focus Event ausgelöst werden wenn der Focus des Feldes verlassen wird
	 * 
	 * */
	protected JTextField returnPwdField () {
		if ( this.loginPwdField == null ) {
			loginPwdField = new JTextField();
			loginPwdField.setPreferredSize( new Dimension( 120, 20 ) );
			loginPwdField.setVisible( true );
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = 1;
			gbc.gridy = 1;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			pnlLoginLayout.setConstraints( loginPwdField, gbc );
		}
		return loginPwdField;
	}
		
	/**
	 * 
	 * Login Button der einen Event feuert um sich ins System einzuloggen
	 * 
	 * */
	protected JButton returnBtnLogin () {
		if ( this.loginButton == null ) {
			loginButton = new JButton();
			loginButton.setPreferredSize( new Dimension( 120, 20 ) );
			loginButton.setText( "Login" );
			loginButton.addActionListener( new BtnLoginAction( this, vName, nName ) );
			loginButton.setVisible( true );
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = 1;
			gbc.gridy = 2;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			pnlLoginLayout.setConstraints( loginButton, gbc );
		}
		return loginButton;
	}
	
	/**
	 * 
	 * Layoutmanger wird ans Panel übergeben
	 * 
	 * */
	protected GridBagLayout createLogPanelLayout () {
		pnlLoginLayout = new GridBagLayout();
		return pnlLoginLayout;
	}
}

Das Problem besteht aber immer noch. Habe ich etwas falsch verstanden?
 
C

Camino

Gast
Also, um wirklich nur 1 Panel mit 2 Textfeldern + Labels und 1 Button darzustellen, kommt mir der Quellcode ziemlich übertrieben und unnötig lang vor. Warum lagerst du z.B. die Erstellung des GridBagLayouts in eine eigene Methode aus und machst das nicht oben im Konstruktor? Und bei Labels und Panels musst du nicht setVisible(true) aufrufen. Ich würde erst mal den Code auf das Nötigste reduzieren...

Anstatt:
Java:
...
lblLogName = new JLabel();
Font f = new Font( "Arial", Font.BOLD, 12 );
lblLogName.setText( "Loginname" );
lblLogName.setFont( f );
...
kannst du auch so schreiben:
Java:
...
lblLogName = new JLabel( "Loginname" );
lblLogName.setFont( new Font( "Arial", Font.BOLD, 12 ) );
...
 
Zuletzt bearbeitet von einem Moderator:

Meru

Bekanntes Mitglied
Genauer lesen, ich habe da oben 2 unterschiedliche Probleme gezeigt.

Java:
private String vName; // == null
private String nName; // == null

public LoginGuiElement () {
        // ...
        this.add( this.returnBtnLogin() ); // Hier gehst du zu     returnBtnLogin (), vName, nName sind hier noch null
        vName = this.returnNameField().getText();
        nName = this.returnPwdField().getText();
        System.out.println( vName );
        System.out.println( nName );
        // ...
}

protected JButton returnBtnLogin () {
        if ( this.loginButton == null ) {
            loginButton = new JButton();
            loginButton.setPreferredSize( new Dimension( 120, 20 ) );
            loginButton.setText( "Login" );
            loginButton.addActionListener( new BtnLoginAction( this, vName, nName ) ); // die sind noch null beim ersten Aufruf
            //.....
         }
}


Du hast die beiden String-Variablen, beide sind null! Jetzt rufst du die Mehtode returnBtnLogin () auf und übergibst der Klasse BtnLoginAction die beiden null-Werte.
Erst eine Zeile nach this.add( this.returnBtnLogin() ); gibst du den beiden Strings die entsprechenden Werte. Jetzt sind sie nicht mehr null in deiner Hauptklasse. Aber in der BtnLoginAction -Klasse stehen sie noch als null drin, weil die hast du auch mit null instanziiert.
 

Lit-Web

Aktives Mitglied
Ok jetzt habe ich das richtig verstanden.

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

public class LoginGuiElement extends JPanel {
	
	protected JLabel lblLogName;
	protected JLabel lblPwd;
	protected GridBagLayout pnlLoginLayout;
	protected JTextField loginNameField;
	protected JTextField loginPwdField;
	protected JButton loginButton;
	
	/**
	 * 
	 * Konstruktor gibt das fertige Panel mit allen Loginelementen zurück
	 * 
	 * */
	public LoginGuiElement () {
		this.setSize( 500, 500 );
		this.setLayout( this.createLogPanelLayout() );
		this.setPreferredSize( new Dimension( 500, 150 ) );
		this.setBackground( Color.white );
		this.add( this.returnLblLogName() );
		this.add( this.returnLblPwd() );
		this.add( this.returnNameField() );
		this.add( this.returnPwdField() );
		this.add( this.returnBtnLogin() );
		this.setVisible( true );
	}
	
	/**
	 * 
	 * Label Loginname
	 * 
	 * */
	protected JLabel returnLblLogName () {
		lblLogName = new JLabel();
		Font f = new Font( "Arial", Font.BOLD, 12 );
		lblLogName.setText( "Loginname" );
		lblLogName.setSize( 120, 20 );
		lblLogName.setFont( f );
		lblLogName.setForeground( Color.black );
		lblLogName.setLocation( 10, 40 );
		lblLogName.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( lblLogName, gbc );
		return lblLogName;
	}
	
	/**
	 * 
	 * Label Passwortext
	 * 
	 * */
	protected JLabel returnLblPwd () {
		lblPwd = new JLabel();
		Font f = new Font( "Arial", Font.BOLD, 12 );
		lblPwd.setText( "Passwort" );
		lblPwd.setSize( 120, 20 );
		lblPwd.setFont( f );
		lblPwd.setForeground( Color.black );
		lblPwd.setLocation( 10, 40 );
		lblPwd.setVisible( true );
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		pnlLoginLayout.setConstraints( lblPwd, gbc );
		return lblPwd;
	}
	
	/**
	 * 
	 * Eingabefeld für den Loginnamen
	 * 
	 * */
	protected JTextField returnNameField () {
		if ( this.loginNameField == null ) {
			loginNameField = new JTextField();
			loginNameField.setPreferredSize( new Dimension( 120, 20 ) );
			loginNameField.setVisible( true );
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = 1;
			gbc.gridy = 0;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			pnlLoginLayout.setConstraints( loginNameField, gbc );
		}
		return loginNameField;
	}
	
	/**
	 * 
	 * Eingabefeld für die Passworteingabe
	 * von hier aus soll der Focus Event ausgelöst werden wenn der Focus des Feldes verlassen wird
	 * 
	 * */
	protected JTextField returnPwdField () {
		if ( this.loginPwdField == null ) {
			loginPwdField = new JTextField();
			loginPwdField.setPreferredSize( new Dimension( 120, 20 ) );
			loginPwdField.setVisible( true );
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = 1;
			gbc.gridy = 1;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			pnlLoginLayout.setConstraints( loginPwdField, gbc );
		}
		return loginPwdField;
	}
		
	/**
	 * 
	 * Login Button der einen Event feuert um sich ins System einzuloggen
	 * 
	 * */
	protected JButton returnBtnLogin () {
		if ( this.loginButton == null ) {
			loginButton = new JButton();
			loginButton.setPreferredSize( new Dimension( 120, 20 ) );
			loginButton.setText( "Login" );
			loginButton.addActionListener( new BtnLoginAction( this, this.returnNameField().getText(), this.returnPwdField().getText() ) );
			loginButton.setVisible( true );
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = 1;
			gbc.gridy = 2;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			pnlLoginLayout.setConstraints( loginButton, gbc );
		}
		return loginButton;
	}
	
	/**
	 * 
	 * Layoutmanger wird ans Panel übergeben
	 * 
	 * */
	protected GridBagLayout createLogPanelLayout () {
		pnlLoginLayout = new GridBagLayout();
		return pnlLoginLayout;
	}
}

Ich übergebe das nun auf diese Art und Weise und trotzdem gleihes Resultat. Jetzt dürfte der Wert von getText(9 ja eigentlich nicht mehr null sein. Nun kommt noch nicht einmal mehr null als Ausgabe.

Hier mache ich nun die Testausgabe, es kommt nur ein Bindestrich raus.
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class BtnLoginAction implements ActionListener {
	
	protected JPanel logPanel;
	protected String logName;
	protected String logPwd;
	protected LoginCheck ckl;
	
	public BtnLoginAction ( JPanel pLogPanel, String pLogName, String pLogPwd ) {
		logPanel = pLogPanel;
		logName = pLogName;
		logPwd = pLogPwd;
		ckl = new LoginCheck( new DatabaseConnect( "ConfigFiles/mysqlProperties.txt" ) );
	}
	
	public void actionPerformed ( ActionEvent pEvent ) {
		
		System.out.println( logName + " - " + logPwd );
		
		if ( ckl.login( logName, logPwd ) == true ) {
			logPanel.setVisible( false );
		}
	}
}

Ich habe grad nen ziemlichen Denkhänger.

Ps.: Den code werde ich noch reduzieren, bin ganz am anfang mit Java.
 

Meru

Bekanntes Mitglied
Das liegt daran, das Strings immutable sind. (Strings sind immutable - Java als erste Programmiersprache - Javaschublade)

Du gibst der Klasse BtnLoginAction 2 Strings rein. Diese sind beim Anfang via this.returnNameField().getText() noch leer. Nicht null, aber leer.
Die Klasse BtnLoginAction hat nun die 2 leeren Strings.

Jetzt tippst du in die EingabeFelder etwas hinein und drückst den Knopf.
Wo aber sagst du, dass beim Künpf-klicken die neuen Werte deiner TextFelder übertragen werden sollen?
Nur weil du einmal den getText uebergeben hast, heißt das lange nicht, das es danach immer automatisch geht.

Du musst also sicherstellen, dass beim Knopf-klicken die Werte aus den TextFeldern ausgelesen werden, diese in deine LoginKlasse geschrieben werden, die entsprechende Methode in deiner LoginKlasse aufgerufen wird um darin dann die Auswertung zu machen.
 

Lit-Web

Aktives Mitglied
Ok ich bin ehrlich das ich im Moment vollkommen grad gegen die Wand gefahren bin.

Ich weiß momentan grad gar keinen Ansatz mehr und verstehe auch grad nicht so wirklich wie du jetzt was meinst. Das mit null Werten in den Variablen kapiere ich ja noch, aber das jetzt grad überhaupt nicht.
 

Lit-Web

Aktives Mitglied
Ok ich war da wohl zu voreilig, habe es geschafft.

Ich übergebe das Textfeld Object als Parameter und rufe dann die getText(9 Methode in der Login Klasse auf.

Hier der Code für Nachwelt denen es auch mal so geht.

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

public class LoginGuiElement extends JPanel {
	
	protected JLabel lblLogName;
	protected JLabel lblPwd;
	protected GridBagLayout pnlLoginLayout;
	protected JTextField loginNameField;
	protected JTextField loginPwdField;
	protected JButton loginButton;
	
	protected GridBagLayout gbl;
	protected GridBagConstraints gbc;
	
	/**
	 * 
	 * Konstruktor gibt das fertige Panel mit allen Loginelementen zurück
	 * 
	 * */
	public LoginGuiElement () {
		gbl = new GridBagLayout();
		gbc = new GridBagConstraints();
		this.setSize( 500, 500 );
		this.setLayout( gbl );
		this.setPreferredSize( new Dimension( 500, 150 ) );
		this.setBackground( Color.white );
		this.add( this.returnLblLogName() );
		this.add( this.returnLblPwd() );
		this.add( this.returnNameField() );
		this.add( this.returnPwdField() );
		this.add( this.returnBtnLogin() );
		this.setVisible( true );
	}
	
	/**
	 * 
	 * Label Loginname
	 * 
	 * */
	protected JLabel returnLblLogName () {
		lblLogName = new JLabel();
		lblLogName.setText( "Loginname" );
		lblLogName.setPreferredSize( new Dimension( 120, 20 ) );
		lblLogName.setFont( new Font( "Arial", Font.BOLD, 12 ) );
		lblLogName.setForeground( Color.black );
		lblLogName.setLocation( 10, 40 );
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		gbl.setConstraints( lblLogName, gbc );
		return lblLogName;
	}
	
	/**
	 * 
	 * Label Passwortext
	 * 
	 * */
	protected JLabel returnLblPwd () {
		lblPwd = new JLabel();
		lblPwd.setText( "Passwort" );
		lblPwd.setPreferredSize( new Dimension( 120, 20 ) );
		lblPwd.setFont( new Font( "Arial", Font.BOLD, 12 ) );
		lblPwd.setForeground( Color.black );
		lblPwd.setLocation( 10, 40 );
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.gridwidth = 1;
		gbc.gridheight = 1;
		gbc.weightx = 100;
		gbc.weighty = 20;
		gbl.setConstraints( lblPwd, gbc );
		return lblPwd;
	}
	
	/**
	 * 
	 * Eingabefeld für den Loginnamen
	 * 
	 * */
	protected JTextField returnNameField () {
		if ( this.loginNameField == null ) {
			loginNameField = new JTextField();
			loginNameField.setPreferredSize( new Dimension( 120, 20 ) );
			gbc.gridx = 1;
			gbc.gridy = 0;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			gbl.setConstraints( loginNameField, gbc );
		}
		return loginNameField;
	}
	
	/**
	 * 
	 * Eingabefeld für die Passworteingabe
	 * von hier aus soll der Focus Event ausgelöst werden wenn der Focus des Feldes verlassen wird
	 * 
	 * */
	protected JTextField returnPwdField () {
		if ( this.loginPwdField == null ) {
			loginPwdField = new JTextField();
			loginPwdField.setPreferredSize( new Dimension( 120, 20 ) );
			gbc.gridx = 1;
			gbc.gridy = 1;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			gbl.setConstraints( loginPwdField, gbc );
		}
		return loginPwdField;
	}
		
	/**
	 * 
	 * Login Button der einen Event feuert um sich ins System einzuloggen
	 * 
	 * */
	protected JButton returnBtnLogin () {
		if ( this.loginButton == null ) {
			loginButton = new JButton();
			loginButton.setPreferredSize( new Dimension( 120, 20 ) );
			loginButton.setText( "Login" );
			loginButton.addActionListener( new BtnLoginAction( this, this.returnNameField(), this.returnPwdField() ) );
			loginButton.setVisible( true );
			gbc.gridx = 1;
			gbc.gridy = 2;
			gbc.gridwidth = 1;
			gbc.gridheight = 1;
			gbc.weightx = 120;
			gbc.weighty = 20;
			gbl.setConstraints( loginButton, gbc );
		}
		return loginButton;
	}
}

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

public class BtnLoginAction implements ActionListener {
	
	protected JPanel logPanel;
	protected JTextField logName;
	protected JTextField logPwd;
	protected LoginCheck ckl;
	
	public BtnLoginAction ( JPanel pLogPanel, JTextField pLogName, JTextField pLogPwd ) {
		logPanel = pLogPanel;
		logName = pLogName;
		logPwd = pLogPwd;
		ckl = new LoginCheck( new DatabaseConnect( "ConfigFiles/mysqlProperties.txt" ) );
	}
	
	public void actionPerformed ( ActionEvent pEvent ) {
		
		System.out.println( logName.getText() + " - " + logPwd.getText() );
		
		if ( ckl.login( logName.getText(), logPwd.getText() ) == true ) {
			logPanel.setVisible( false );
		}
	}
}

Java:
import java.sql.*;

public class LoginCheck {
	
	protected Connection dbCon;
	protected Statement stmt;
	protected boolean logged;
	
	public LoginCheck ( DatabaseConnect pDbCon ) {
		dbCon = pDbCon.connectToDb();
		
		try {
			stmt = dbCon.createStatement();
		} catch ( SQLException e ) {
			e.printStackTrace();
		}
	}
	
	public boolean login ( String pVorname, String pNachname ) {
		try {
			int cntLog = 0;
			
			String sqlLog = "SELECT Count(*) As cntLog, vorname, nachname FROM tsv_mitglieder WHERE" +
					" vorname = '" + pVorname + "' AND" +
					" nachname = '" + pNachname + "'";
			ResultSet resultRows = stmt.executeQuery( sqlLog );
			
			while( resultRows.next() ) {
				cntLog = resultRows.getInt( "cntLog" );
			}
			
			System.out.println( cntLog );
			
			if ( cntLog > 0 ) {
				logged = true;
			} else {
				logged = false;
			}
			
		} catch( SQLException e ) {
			e.printStackTrace();
		}
		
		return logged;
	}
}

Ich bedanke mich für die Hilfe und Geduld.

Mfg Lit-Web
 

Meru

Bekanntes Mitglied
Ja, das wäre möglich

Jedoch würde das OOP Sicht eine eher schlechte Lösung sein.
Deine LgoinKlasse soll eigentlich nicht wirklich wissen, woher sie die LoginDaten bekommt. Sei es nun ein TextField oder via Kommandozeile, TextArea, Tabelle ..........

Besser wäre es, wenn du sie davon unabhängig machst und wirklich die Strings reinreichst. Somit kannst du nachher beliebig andere LoginMechanismen entwickeln.

Ich habe das Beispiel mal gebastelt als du schon gepostet hattest.
Du musst nicht den ActionListener auslagern, sondern eher den LoginCheck. Dieser wird dann wiederverwendbar. Mit dem ActionListener stellst du nur sicher, das die Werte richtig geschrieben werden und eine Auswertung stattfinden soll.



Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class Login {
	private JTextField name;
	private JTextField pw;
	private JButton		button;
	
	private LoginChecker	loginChecker;

	public Login() {
		init();
		initGUI();
	}

	private void init() {
		this.loginChecker = new LoginChecker();
		
		this.name 	= new JTextField();
		this.pw		= new JTextField();
		
		this.button = new JButton("Login");
		this.button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// entweder so
				loginChecker.checkLogin(name.getText(), pw.getText());
				
				//oder so
				loginChecker.setName(name.getText());
				loginChecker.setPW(pw.getText());
				loginChecker.check();
			}
		});
	}
	
	private void initGUI() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.getContentPane().setLayout(new GridLayout(3,2));
		frame.add(new JLabel("Name"));
		frame.add(this.name);
		frame.add(new JLabel("PW"));
		frame.add(this.pw);
		frame.add(this.button);
		
		frame.pack();
		frame.setVisible(true);
	}


	public static void main(String[] args) {
		new Login();
	}
}

class LoginChecker{
	
	public boolean checkLogin(String name, String pw){
		System.out.println(name + " - " + pw);
		if (name.equals("muster") && pw.equals("mann")){
			return true;
		}
		return false;
	}
	
	
	//
	////
	////// oder
	////
	//
	
	private String name;
	private String pw;
	
	public void setName(String name){
		this.name = name;
	}
	
	public void setPW(String pw){
		this.pw = pw;
	}
	
	/*
	 * Darauf achten, dass name und pw vorher gesetzt wurden
	 */
	public boolean check(){
		System.out.println(name + " - " + pw);
		if (this.name.equals("muster") && this.pw.equals("mann")){
			return true;
		}
		return false;
	}
}
 

Lit-Web

Aktives Mitglied
Danke das macht natürlich mehr Sinn.

Der Umstieg von PHP auf Java ist schwieriger als ich dachte. In PHP sind eben Sachen möglich die in Java nicht gehen.

Werde mir das Beispiel mal verinnerlichen.

Gruß Lit-Web
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z JTextField - getText() Methode abbrechen? Java Basics - Anfänger-Themen 8
L JTextField auslesen mit getText() wie abspeichern? Java Basics - Anfänger-Themen 2
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
S Möglichkeit, mit g.draw etwas vor ein JTextfield zu „zeichnen“? Java Basics - Anfänger-Themen 7
I ResultSet aus meiner SQL-Abfrage in einem JTextfield ausgeben. Java Basics - Anfänger-Themen 1
S ArrayList Username und passwort mit JTextField eingaben abgleichen Java Basics - Anfänger-Themen 10
B Variablen Int Variabel in JTextField ändern Java Basics - Anfänger-Themen 2
mhmt_03 dafür sorgen, dass im JTextfield nur zahlen eingebbar sind Java Basics - Anfänger-Themen 9
M JTextField nur Zahleneingaben zulassen, eingabe sperren Java Basics - Anfänger-Themen 24
E JButton und JTextField Java Basics - Anfänger-Themen 1
J JTextField Bezeichnung als Variable Java Basics - Anfänger-Themen 3
M Von einem JTextField Doublewerte entgegennehmen Java Basics - Anfänger-Themen 2
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
D Klassen JTextField wird nur zu 50% angezeigt. Java Basics - Anfänger-Themen 15
F JTextField Kursiv und Fett machen Java Basics - Anfänger-Themen 4
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
CptK Interface JTextField: Action mit Enter ausführen Java Basics - Anfänger-Themen 16
K Methoden JTExtField mit Array erzeugen Java Basics - Anfänger-Themen 13
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
J Erste Schritte Wert aus JTextField zurückgeben Java Basics - Anfänger-Themen 6
F Aus einer anderen Klasse auf ein JTextField zugreifen Java Basics - Anfänger-Themen 17
P Cursor in JTextField setzen Java Basics - Anfänger-Themen 11
F Variablen JTextField-Inhalt kann nicht mit String abgeglichen werden Java Basics - Anfänger-Themen 2
F Interface JTextField am Anfang unsichtbar o_o Java Basics - Anfänger-Themen 3
D Klassen Wert aus JTextfield in JLabel (andere Klasse) darstellen. Java Basics - Anfänger-Themen 60
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
S Variable in JTextField soll immer um 5 zunehmen Java Basics - Anfänger-Themen 8
B Interface JTextField Eingabe als String verwenden Java Basics - Anfänger-Themen 3
K OOP Mit anderer Klasse auf JTextField zugreifen Java Basics - Anfänger-Themen 5
Liondary JTextfield Java Basics - Anfänger-Themen 8
W JTextField-Objekt liest Umlaute mit falschen Zeichen ein Java Basics - Anfänger-Themen 5
Z Fürge nur ein JTextField ein und danach wird nichts mehr angezeigt Java Basics - Anfänger-Themen 3
S JTextField zu ArrayList hinzufügen Java Basics - Anfänger-Themen 3
Z Vector in jTextField/jLabel darstellen Java Basics - Anfänger-Themen 4
P jTextField - Auslesen, in Variablen speichern, eingeben... Java Basics - Anfänger-Themen 7
J Methoden JTextArea auslesen und in JTextfield ausgeben Java Basics - Anfänger-Themen 13
M Double-Ausgabe in JTextField fehlerhaft Java Basics - Anfänger-Themen 2
U Inhalt von JTextfield an andere Klasse weitergeben Java Basics - Anfänger-Themen 13
I JTextfield[] innerhalb eines Itemlistener aufrufen Java Basics - Anfänger-Themen 2
S Einzelne Buchstaben aus Jtextfield in array Java Basics - Anfänger-Themen 2
S Verhalten von JTextField in einem JTabbedPane (Register) Java Basics - Anfänger-Themen 6
L JTextField/Listener Input Problem Java Basics - Anfänger-Themen 2
G JTextField, DocumentListener, Fehler bei setText() Java Basics - Anfänger-Themen 3
S Input/Output GUI Eingabe in JTextfield in Variable speichern Java Basics - Anfänger-Themen 7
C JTextField füllen Java Basics - Anfänger-Themen 5
C jtextfield und jtable Java Basics - Anfänger-Themen 34
K JTextField in ein Spiel einfügen Java Basics - Anfänger-Themen 2
K Encoding von JTextfield Java Basics - Anfänger-Themen 2
X JTable mit Inhalten aus JTextField o.ä. füllen Java Basics - Anfänger-Themen 4
P Klassen JTextfield aus anderer Klasse herausfüllen Java Basics - Anfänger-Themen 12
K JTextField auslesen, in int umwandeln und in einer anderen Klasse als Zähler verwenden Java Basics - Anfänger-Themen 3
M Datumsformat in JTextfield Java Basics - Anfänger-Themen 10
S JTextField nervt rum... Java Basics - Anfänger-Themen 4
B JTextField Java Basics - Anfänger-Themen 5
D Durch Button klick wert in JTextField einfügen Java Basics - Anfänger-Themen 5
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
B JTextField Java Basics - Anfänger-Themen 5
C Problem mit JTextField Java Basics - Anfänger-Themen 8
A Klassen JTextField eigtl leer aber es werden Methoden ect. angezeigt Java Basics - Anfänger-Themen 9
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
D jtextField Ausgabe double Java Basics - Anfänger-Themen 4
D JTextField verwenden ohne Eingabe einer Variable Java Basics - Anfänger-Themen 4
J GUI - JTextField Anordnung Java Basics - Anfänger-Themen 2
S nur Buchstaben in JTextField Java Basics - Anfänger-Themen 3
S JTextfield Auswertung mit FocusListener Java Basics - Anfänger-Themen 7
M Hilfe JTextfield Ergebnis Java Basics - Anfänger-Themen 2
B GUI- JTextField - Übung Java Basics - Anfänger-Themen 5
M OOP Wie greife ich auf JTextField zu? Java Basics - Anfänger-Themen 2
P Eingabe aus JTextField/Area an eine andere Klasse übergeben. Java Basics - Anfänger-Themen 2
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
F GUI JTextField aktualisieren Java Basics - Anfänger-Themen 3
B jTextField bei Enter eingabe absenden? Java Basics - Anfänger-Themen 2
S JTextField leeren ohne setText("")? Java Basics - Anfänger-Themen 3
A fire button on JTextField Enter Java Basics - Anfänger-Themen 2
G JTextField() Anzeige - if-Anweisungen Java Basics - Anfänger-Themen 2
R Erste Schritte codecopieren von Editor nach Eclipse / JTextField Java Basics - Anfänger-Themen 4
L Zeichen in jTextField markieren Java Basics - Anfänger-Themen 2
M Text auf JTextField auslesen per Button Java Basics - Anfänger-Themen 4
L Null Pointer Exception bei Focus Event bei einem JTextField Java Basics - Anfänger-Themen 2
C Ausgewähltes Element einer JCombobox in JTextField Java Basics - Anfänger-Themen 3
H Prüfen welches JTextfield ausgewählt/selektiert ist? Java Basics - Anfänger-Themen 7
B Input/Output jTextField - KeyEvent - Zeichen soll nicht erscheinen Java Basics - Anfänger-Themen 6
D JPasswordField - JTextField Java Basics - Anfänger-Themen 5
J JTextfield mit Enter leeren Java Basics - Anfänger-Themen 3
H JtextField auslesen und in JLable einfuegen Java Basics - Anfänger-Themen 7
D JTextField anstatt Jbuttons Java Basics - Anfänger-Themen 9
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
S mit eigener Klasse JTextField ändern Java Basics - Anfänger-Themen 3
M JTextField durch Button auslösen Java Basics - Anfänger-Themen 9
J JLabel mit Hilfe von JTextfield benennen Java Basics - Anfänger-Themen 7
J Keylistener aber wie jTextField auswahl? Java Basics - Anfänger-Themen 3
M JTextField Java Basics - Anfänger-Themen 7
O JTextField Schriftgröße ändern Java Basics - Anfänger-Themen 1
J Nur ein Komma in JTextField zulassen... Java Basics - Anfänger-Themen 9
C Problem mit JPopupMenu, JTextField und Keylistener Java Basics - Anfänger-Themen 2
S JTextField an SQL mit -> Kommazahlen Java Basics - Anfänger-Themen 4
K JTextField auslesen, wenn Enter gedrückt.. Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben