JFrame & paint - neues JFrame

MRS

Mitglied
Hallo zusammen.
Ich habe erste seit kurzem angefangen mit Java zu programmieren und bin wohl daher auch noch ein wenig beschränkt in meiner Erfahrung. Daher wäre es echt nett wenn Ihr mir (wenn es geht) einige Beispiele zeigen würdet wie es richtig funktioniert.

Zu meinem Programm...
Ich habe ein Programm mit dem ich eine Passwort Anmeldung machen will und bei richtiger Anmeldung soll das Anmelde Fenster geschlossen werden und das Hauptprogramm Fenster geöffnet werden.

Meine Probleme sind folgende...
1. alles was ich in der paint-Methode schreibe ist nicht sichtbar.
2. ich habe irhgendwie probleme die Variablen richtig zu deklarieren. müssen die final sein? und wenn die final sind habe ich probleme mit der pass Variable.
3. wenn das Passwort richtig ist soll das Hauptprogramm gestartet werden.... Nur das mir das Hauptprogramm immer mit der Anmeldung startet.(Bin wohl immer noch zu tief in C Gedanken wo sich eins nach dem anderen ab arbeitet.)

Warum? Was müsste ich ändern?
Java:
// ---------------- Passwortabfrage ----------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class PassAbf extends JFrame
{
	public static void PAbfrage()
	{
		int zaehler=0;
		String pass = new String();
		String user = new String();
		String userOK="AAA", passOK="111";
		final JFrame fenster1 = new JFrame("Anmeldung");
//		----------------------- Passwort Fenster ---------------------
		fenster1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster1.setIconImage(Bilder.mainicon);
		fenster1.setBackground(new Color(200,200,255));
		fenster1.setSize(400,200);
		fenster1.setLayout(null);    
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		fenster1.setLocation((d.width-fenster1.getSize().width)/2,(d.height-fenster1.getSize().height)/2);
		fenster1.setResizable(false);
		fenster1.setVisible(true);
		
		final JTextField username = new JTextField("");
		username.setBounds(120,50,220,26);
		fenster1.add(username);
		
		final JPasswordField password = new JPasswordField("");
		password.setEchoChar('~');
		password.setBounds(120,100,220,26);
		fenster1.add(password);
		
		JButton okPassAbf = new JButton("OK");
		ActionListener okPass = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				user=username.getText();
				pass=password.getText();
		    	zaehler++;
		    	
		    	System.out.println("versuch: "+zaehler);
				System.out.println("username: "+user);
				System.out.println("passwort: "+pass);
				
		    	if(user.equals(userOK) && pass.equals(passOK)){System.out.println("OKOK"); fenster1.dispose();};
		    	if(zaehler==3)System.exit(0);				
			}
		};
		okPassAbf.addActionListener(okPass);
		okPassAbf.setBounds(50,140,100,20);
		fenster1.add(okPassAbf);
		JButton endePassAbf = new JButton("Beenden");
		endePassAbf.addActionListener(Action.schliesser);
		endePassAbf.setBounds(250,140,100,20);
		fenster1.add(endePassAbf);
	}

	public void paint(Graphics g)
	{      
		g.setColor(new Color(2,2,2));
		g.setFont(new Font("Arial", Font.BOLD, 20));
		g.drawString("Anmeldung", 140, 55);
		g.setFont(new Font("Arial", Font.BOLD, 14));
		g.drawString("Username:", 30, 95);
		g.drawString("Passwort:", 35, 145);
		super.update(g);
	}
}

Java:
import javax.swing.*;

public class Start 
{
	public static void main( String[] args )
	{
		PassAbf.PAbfrage();                   // <------ Passwortabfrage Fenster
		Arbeitsflaeche.Hauptprogramm(); // <------ Hauptprogramm Fenster
	}
}

Vielen Dank schon mal!
 
Zuletzt bearbeitet:
Hallo M(a)R(ku)S,

1. Die Variablen und Objekte solltest du außerhalb, deiner Methode definieren. Da der ActionListener eine Innere Klasse ist, kannst du darin auf Methodenvariablen nicht zugreifen. Sind die Variablen und Objekte außerhalb der Methode definiert, besteht kein Problem.

2. Die Methode PAbfrage() sollte lieber nicht statisch sein, da sonst alle Variablen die darin genutzt werden ebenfalls statisch deklariert werden müssten, und es dem sind des OOP widerspricht.

3. Du hast einmal mit "extends JFrame" von JFrame abgeleitet aber auch ein weiteres JFrame mit fenseter1 erzeugt. Die Komponenten addest du auf fenster1, zeigst mit setvisible() diesen an, jedoch zeichnen tust du auf das andere JFrame das nicht angezeigt wird.


Vg Erdal
 
Hallo MRS,

was ich noch vergessen habe.

4. Beschriftungen für Textfelder und ähnlich zeichnet man für gewöhnlich nicht, dafür gibt es die Klasse JLabel.

Ich würde dir wärmstens empfehlen, das eine oder andere Kapitel hier durchzulesen:
http://www.galileocomputing.de/openbook/javainsel5/

Dieses Buch führt dich Schritt für Schritt durch die verschiedenen Stationen des Programmierens anhand vielen schönen Beispielen.


Vg Erdal
 
Hmmm....
Also das mit dem JPanel habe ich hingekriegt.
Nur bei den anderen Sachen komm ich nicht so weiter.
Könntest du mir vielleicht ein Beipiel geben?



Edit: Das mit dem M(a)R(ku)S... da liegste leider falsch^^
 
Hallo MRS (<- englisch Anrede für Frau, du bist eine Frau ;) ),

ich hatte mal etwas langeweile! So würde das ein etwas forgeschrittener Programmierer implementieren.

Enthalten sind Beispiele für die Verwendung von ...
- Layout
- Thread
- Objekten
- Swing (JLabel, JOptionPane...)
- Array
- Listener

Java:
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JFrame;

public class ApplicationMain extends JFrame {

	public ApplicationMain() {
		super("Hauptprogramm");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationByPlatform(true);
		this.setSize(600, 400);
	}

	public void showMainApplication() {
		this.setVisible(true);
	}

	public static void main(String[] args) {
		ApplicationMain main = new ApplicationMain();
		PassWordDialog pwd = new PassWordDialog();

		if (pwd.showPassWordDialog())
			main.showMainApplication();
		else
			System.exit(0);
	}

	public void paint(Graphics g) {
		super.paint(g);
		g.setFont(new Font("Arial",Font.BOLD,32));
		g.drawString("Willkommen im Hauptprogramm" , 50, this
				.getHeight() / 4);
		
	}

}

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.*;

public class PassWordDialog extends JDialog implements ActionListener {

	private JLabel l1 = new JLabel("Bitte geben Sie ihre Benutzerdaten ein.");

	private JLabel l2 = new JLabel("Benutzername:");

	private JLabel l3 = new JLabel("Passwort:");

	private JButton b1 = new JButton("Ok");

	private JButton b2 = new JButton("Abbrechen");

	private JTextField t1 = new JTextField();

	private JPasswordField t2 = new JPasswordField();

	private JPanel p1 = new JPanel();

	private JPanel p2 = new JPanel();

	private String[] registeredUser = { "Klaus", "Peter", "Hans" };

	private String[] passWords = { "1111", "2222", "3333" };

	private boolean finish = false;

	private boolean validAccount = false;

	private String message1 = "Bitte tragen Sie Ihren Benutzernamen und Ihr Passwort ein!";

	private String message2 = "Benutzername und/oder Passwort falsch!";

	public PassWordDialog() {
		super(new JFrame(), "Anmeldung", true);
		this.setLayout(new GridBagLayout());
		this.setSize(400, 250);
		this.setLocationByPlatform(true);
		this.setAlwaysOnTop(true);

		p2.setLayout(new GridLayout(1, 2));
		p2.add(b1);
		p2.add(b2);

		GridBagConstraints gc = new GridBagConstraints();
		gc.weightx = 1;
		gc.weighty = 1;
		gc.insets = new Insets(5, 10, 5, 10);

		gc.anchor = GridBagConstraints.WEST;
		gc.fill = GridBagConstraints.NONE;
		gc.gridx = 0;
		gc.gridy = 0;
		gc.gridwidth = 2;
		gc.gridheight = 1;
		this.add(l1, gc);

		gc.anchor = GridBagConstraints.WEST;
		gc.fill = GridBagConstraints.HORIZONTAL;
		gc.weightx = 0;
		gc.gridy = 1;
		gc.gridwidth = 1;
		this.add(l2, gc);

		gc.weightx = 1;
		gc.gridx = 1;
		this.add(t1, gc);

		gc.weightx = 0;
		gc.gridx = 0;
		gc.gridy = 2;
		this.add(l3, gc);

		gc.weightx = 1;
		gc.gridx = 1;
		this.add(t2, gc);

		gc.weightx = 1;
		gc.gridx = 0;
		gc.gridy = 3;
		gc.gridwidth = 2;
		this.add(new JSeparator(), gc);

		gc.anchor = GridBagConstraints.EAST;
		gc.fill = GridBagConstraints.NONE;
		gc.gridy = 4;
		this.add(p2, gc);

		b1.addActionListener(this);
		b2.addActionListener(this);
	}

	public boolean showPassWordDialog() {
		new Thread() {
			public void run() {
				PassWordDialog.this.setVisible(true);
			}
		}.start();

		while (!finish) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		try {
			return validAccount;
		} finally {
			this.dispose();
		}
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Ok")) {
			if (!t1.getText().equals("")
					& !new String(t2.getPassword()).equals("")) {
				int user = Arrays.asList(registeredUser).indexOf(t1.getText());
				if (user != -1
						&& passWords[user].equals(new String(t2.getPassword()))) {
					finish = true;
					validAccount = true;
				} else
					JOptionPane.showMessageDialog(this, message2,
							"Eingabe fehlerhaft!", JOptionPane.ERROR_MESSAGE);
			} else
				JOptionPane.showMessageDialog(this, message1,
						"Eingabe unvollständig!", JOptionPane.WARNING_MESSAGE);
		} else {
			finish = true;
			validAccount = false;
		}
		t1.setText("");
		t2.setText("");
		t1.requestFocus();
	}
}


Vg Erdal
 
umpf!

Da muss ich mich jetzt mal durchschlagen.... sieht aber gut aus :p

Vielen Dank. werde die nacht mal drüber braten. Morgen ist ja frei *freu*

Ne..... ne Frau bin ich auch nicht^^
Mit dem Namen hast du da garnicht so verkehrt gelegen. Aber nicht ganz
 
Hallo Marcus vs. Marcellus. vs. Marinus vs. Marius vs. Maurus vs. Morris :) ,

das Onlinebuch "Java ist auch eine Insel" nicht vergessen. Immer wenn dir was unklar ist, einfach nachschlagen, hat ein sehr gutes Inhaltsverzeichnis.

Beispiel: JOptionePane
http://www.galileocomputing.de/open...sel15_026.htm#Rxx747java15026040005521F033100

Beispiel: GridBagLayout
http://www.galileocomputing.de/open...sel15_009.htm#Rxx747java15009040005411F04D1F9

Beispiel: paint
http://www.galileocomputing.de/open...sel14_003.htm#Rxx747java14003040004CA1F02A100

Beispiel: Thread
http://www.galileocomputing.de/open...sel09_000.htm#Rxx747java09000040002C41F02A100


Würde die genannten und andere notwendigen Kapitel bzw. Unterkapitel einwenig überfliegen, und die Beispiele ausprobieren. Du wirst jede Komponente oder Technik besser verstehen, wenn du sie getrennt betrachtest.


Vg Erdal
 
Hallo MRS,

schau dir auch mal das JXLoginDialog von SwingLabs an. Sieht a bissel besser aus als meins. Und es bietet auch mehr Funktionen und Möglichkeiten.

http://swinglabs.org/screenshots.jsp

Einfach nur mal so als weitere Info, was es in der Javawelt von der Spezies Logindialogs existiert :) .


Vg Erdal
 
Hey Danke!
Hab die Nacht nen bisschen rumgewuselt....
allerdings hab ich je später es wurde mehr durcheinander gebracht.

Setze mich jetzt nochmal hin und probier nen bisschen rum.
Melde mich aber auf jeden Fall nochmal.
 
Du flashray....
Erstmal zu der JXLoginDialog... sieht super aus aber deine find ich besser. Da verstehe ich wenigstens noch was (ist nämlich auch super^^).
Und http://www.galileocomputing.de ist meine neue Freizeitbeschäftigung geworden^^.


Aber ein zwei Sachen find ich immer noch nicht ganz raus.
Warum kriege ich die hintergrund Farbe eigentlich nicht geändert?
Ich habe bei dir mal " this.setBackground(new Color(22,222,22)); " eingefühgt.
Die Farbe die sein soll flacker kurz auf aber wird dann sofort wieder überdeckt.

Jetzt habe ich gelesen das ich die Update-Methode überschreiben soll.....
Huh?!:suspekt:
Stimmt das, damit ich ne andere Hintergrundfarbe kriege?

Achso... :p wäre, wenn ich Bilder in die Buttons setzten will " JButton( String text, Icon icon ) " das richtige?
 
Zurück