[Problem] Handling multiple frames

  • Themenstarter Themenstarter uncopyable
  • Beginndatum Beginndatum
U

uncopyable

Gast
Abend

ich hab folgendes Problem ich möchte mehrere Frames laden und auf ein TextField des jeweiligen Frames zugreifen.

ich habe mir gedacht ich füge das Frame jedes mal wenn ein neues gebraucht wird in eine HashMap ein etwa so

Java:
private static Map<String, MeinFrame> frames = new HashMap<String, MeinFrame>(); 

// Es wird ein neues Fenster benötigt  
MeinFrame meinFrame = new MeinFrame(); 
meinFrame.setVisible(true); 

frames.put("Fenster1",meinFrame);  
// Noch eins 
meinFrame = new MeinFrame(); 
meinFrame.setVisible(true); 

frames.put("Fenster2",meinFrame);  

// Text in Fenster1 ändern  

MeinFrame tmpFrame = frames.get("Fenster1"); 
if (tmpFrame != null) { 
tmpFrame.textField.setText("Test"); 
} 

/* So das Problem ist nun das der Text nicht dem Fenster1 
eingefügt wird sondern dem Fenster2 
 bzw. wird es immer dem zuletzt geöffnetem Frame eingefügt. 
*/ 

}

Weiß jemand was ich falsch mache?
Danke schon mal
 
Ich würde mal raten, du erzeugst dein Keys für die Map in Wirklichkeit dynamisch und das ist jedesmal der selbe Key, dann würde das beschriebene Verhalten eintreten. Aber nicht mit dem geposteten Code, das ist vollkommen unmöglich.
 
Du wirst den Beispielcode ja nicht eins zu eins aus deinem realen Code kopiert haben.

Ich denke, du hast irgendwo eine Methode die die Namen für die Fenster erzeugt, du wirst sie ja wohl kaum einkompiliert haben, und dass in dieser Methode der Fehler liegt. Als Code:

Java:
private static Map<String, MeinFrame> frames = new HashMap<String, MeinFrame>(); 
 
public String generateNewFrame()
{
    MeinFrame meinFrame = new MeinFrame(); 
    meinFrame.setVisible(true);
    String key=generateNextKey();
    frames.put(key,meinFrame);
    return key;
}

private String generateNextKey()
{
    //k.a. was du in der Methode dann drinstehen hast, aber vermutlich läufts auf 
    return "ImmerDasSelbe";
    //raus
}

Wenn ich mit meiner Vermutung falsch liege, zeig mal deinen richtigen Code.
 
Hallo,

erstmal danke für deine Antwort 🙂

Was ich machen will ist ein Chat mit mehreren Channels, wenn ich mich nun in einen Channel einloggen möchte bekomme ich vom Chat Server z.B den Befehl "Create new Chatwindow" der Befehl beinhaltet unter anderem den Namen des Channels und der Nickname der sich in den Channel einloggt. Mit diesen Daten erstelle ich nun den Fenster Titel des neuen Chat Fenster im Beispiel etwa so


Java:
// Start Klasse 
public class Start {
// ... 
// Globale Map in der Start Klass 
private static Map<String, ChatFrame> channelFrames = new HashMap<String, ChatFrame>();
// ... 

private Thread backgroundWorker = null;
private static Socket s;
public static Map<String, ChatFrame> getChannelFrames() {
		return channelFrames;
	}

public Start() {

// ...
s = new Socket("localhost", 12345);
			backgroundWorker = new BackgroundWorker(this, s);
			backgroundWorker.start();

// ...
}
}

// ...

public class BackgroundThread extends Thread {
private Socket socket;
private Start start;

public  BackgroundThread (Start start,Socket socket) {
		this.groupChat = groupChat;
		this.start = start;
}
public final void run() {


while (true) {
// Daten vom Server lesen  

// Wenn der Befehl "Create new Chatwindow" kommt

ChatFrame ChatFenster = new ChatFrame(start,Nick, Channel);
ChatFenster.setVisible(true);
start.getChannelFrames().put(channelName,ChatFenster);


// Wenn der Befehl "Show Public Message" kommt.
// Der Befehl beinhaltet den Channel Namen, der Nickname des sender sowie die Nachricht

ChatFrame f = start.getChannelFrames().get(channelName);
					if (f != null) {						
					f.publicMessage(nick, nachricht);
					}



}

}

}


// ChatFrame 


public class ChatFrame extends JFrame {

private Start start;

public ChatFrame(Start start,String nick,String channel) {
  setTitle(String.format("jChat - Channel: %s, Nick: %s", nick, channel));
}

public static void publicMessage(String nick, String message) {
		StringBuilder code = new StringBuilder();
		code.append("<b>");
		code.append(nick);
		code.append(": ");
		code.append("</b>");
		code.append(message);
		code.append("<br>");
		textField.setText(code.toString());
	}


}

Hoffe man versteht nun was ich meine falls nicht muss ich halt alles Posten

Danke schon mal im vorraus 🙂

mfg
 
Warum ist die publicMessage() Methode statisch? Das macht für mich keinen Sinn, da liegt vermutlich auch das Problem. Auserdem müsste dein TextFeld dann ja auch statisch sein.
 

Zurück
Oben