Ansicht wechseln

Status
Nicht offen für weitere Antworten.

Paule

Aktives Mitglied
Hallo,

ich hab mir ein Applet geschrieben, was in ferner Zukunft mal ein Chat sein soll. Beim starten des Applets soll eine Instanz der Klasse Anmeldung aufgerufen werden, was auch ohne Probleme klappt. Sobald ich auf "Los geht's" drücke soll dann eine Instanz von Viewer angezeigt werden, und genau das funktioniert leider nicht. Ist bestimmt (hoffentlich) nur ein kleiner Fehler, aber ich finde ihn einfach nicht.

Wäre nett wenn mir jemand hilft. Hier nun der Code:

Code:
import javax.swing.*;

public class Main extends JApplet {
			JPanel activeView;
			
			public void init() {
			      activeView = new Anmeldung(this);
			      getContentPane().add(activeView);
			   }
			   
			   public void changeView(JPanel p) {
			      remove(activeView);
			      activeView = p;
			      getContentPane().add(activeView);
			      validate();
			   }
}

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

public class Anmeldung extends JPanel implements ActionListener {
		Main owner;
		JLabel lblnick;
		JLabel ll1;
		JTextField tnick;
		JButton startchat;
		
		
	public Anmeldung (Main owner) {
		this.owner = owner;
		
		setLayout(new GridLayout(2,2,10,10));
		setPreferredSize(new Dimension(200, 400));
		
		JLabel lblnick = new JLabel("Nickname");
		JLabel ll1 = new JLabel("");
		JTextField tnick = new JTextField(20);
		JButton startchat = new JButton("Los geht's!!");
		
		startchat.addActionListener(this);
		
		add(lblnick);
		add(tnick);
		add(ll1);
		add(startchat);
	}
	
	
	public void actionPerformed (ActionEvent evt) {
		Object source = evt.getSource();  
	   	if (source == startchat)
	         owner.changeView(new Viewer(owner));
	   
	}

}

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

public class Viewer extends JPanel implements ActionListener {
		Main owner;
		JTextArea chatField;
		JTextField tinput;
		JButton binput;
		JLabel ll1;
	
	public Viewer (Main owner) {
		this.owner = owner;
		
		setLayout(new GridLayout(2,2,10,10));
		setPreferredSize(new Dimension(600, 600));
		
		
		JTextArea chatField = new JTextArea("Willkommen im Chat",50, 70);
		chatField.setLineWrap(true);
		JTextField tinput = new JTextField(50);
		JButton binput = new JButton("Abschicken");
		JLabel ll1 = new JLabel("");
		
		binput.addActionListener(this);
		
		add(new JScrollPane(chatField));
		add(ll1);
		add(tinput);
		add(binput);
		
		}
	
	public void actionPerformed(ActionEvent evt) {
		String sText = new String();
		Object source = evt.getSource();
		if (source == binput) {
			sText = tinput.getText();
			chatField.append(sText);
		}
		
	}
}

Danke schon mal im Voraus!!

Gruß Paule!
 

Sky

Top Contributor
Sag mal, hast Du schon mal einen Debugger benutzt?? Hier ist ein Code-Segment, welches laufen sollte:

Code:
public Anmeldung(Main owner) {
  // Bis hier nichts geändert...

  startchat.addActionListener(this);
  startchat.setActionCommand("startchat"); // Zeile eingefügt

  // Hier dann mit deiner Version weiter...
}

public void actionPerformed(ActionEvent evt) {
  if ("startchat".equals(evt.getActionCommand())) { // Zeile geändert
    owner.changeView(new Viewer(owner));
  }
}
 

Paule

Aktives Mitglied
Hallo,

also erstmal danke für die Hilfe, jetzt funktioniert es. Aber da hab ich doch noch mal ne Frage: Die Anweisung "startchat.setActionCommand("..")" muss man doch nicht schreiben oder? Beim initialisieren des Buttons wird das doch eigentlich gleich mit erledigt, oder bin ich da falsch informiert?

Woran lag es denn genau, dass mein Programm nicht funktionierte? Ich hatte die ActionPerformed Methode schon mal bei nem anderen Programm analog geschrieben, mit dem Unterschied, dass dort alles richtig klappte.
Die Bedingungen der if-Anweisung fragen doch, so wie ich das sehe, den gleichen Sachverhalt ab. Nur das deine Variante wahrscheinlich etwas eleganter ist :wink:

Danke für die Hilfe, Paule!!!
 

Sky

Top Contributor
Ok, ich weiss jetzt auch, warum es in früheren Versionen bei Dir ging:

Code:
  public Anmeldung(Main owner) {
    this.owner = owner;

    setLayout(new GridLayout(2, 2, 10, 10));
    setPreferredSize(new Dimension(200, 400));

    JLabel lblnick = new JLabel("Nickname");
    JLabel ll1 = new JLabel("");
    JTextField tnick = new JTextField(20);
    JButton startchat = new JButton("Los geht's!!"); // << Ursache!

    startchat.addActionListener(this);

    add(lblnick);
    add(tnick);
    add(ll1);
    add(startchat);
  }

Grund: Du legst im Konstruktor eine neue Instanz von einem JButton mit dem gleichem Namen an, den Du als Instanz-Variable deniert hast.

Ändere die Zeile in
Code:
startchat = new JButton("Los geht's!!");
und es geht auch mit deiner Version.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben