2016-04-19 8 views
0

Ich habe mich umgeschaut, aber nichts scheint mir zu helfen. Im Grunde schreibe ich ein Multithread-Chat-Programm mit einer GUI. Der Benutzer gibt seinen Namen in ein Textfeld in einer Login-Klasse ein und trifft den Login-Button, der ihn zu einer ClientGUI-Klasse führt. In der Client-GUI-Klasse Theres eine JLabel an der Spitze, dieJLabel von JTextField in einer anderen Klasse bearbeiten

"Willkommen im Chatsystem (Benutzername)"

sagt. Also, was die Benutzereingabe in das Textfeld in der Login-Klasse sollte in der JLabel nach "Willkommen im ChatSystem" erscheinen, aber ich kann nicht herausfinden, warum es nicht funktioniert. Hier ist mein Code:

Login-Klasse:

loginB = new JButton("Login"); 
main.add(loginB); 
loginB.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     ClientGUI clientgui = new ClientGUI(); 
     clientgui.setVisible(true); 
    } 
} 

ClientGUI Klasse:

public ClientGUI(){ 
    Login login = new Login(); 
    String username = login.usernameTF.getText(); 
    welcome = new JLabel("Welcome to ChatSystem "+username, SwingConstants.CENTER); 

} 

Ich verstehe, dass Benutzernamen sollte wirklich von einem JLabel und kein String, aber ich habe viele Möglichkeiten versucht, dies zu tun und ich kann mich anscheinend nicht darum kümmern.

Antwort

2

, das wie das wird nicht funktionieren, weil login.usernameTF.getText(); tatsächlich ein neues erstellte Objekt imClientGUI Konstruktor ...

, was ich würde vorschlagen, zu tun, den Konstruktor zu überlasten und den Namen zu übergeben als Parameter ...

Beispiel:

loginB.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
    ClientGUI clientgui = new ClientGUI(getTheNameAndpassItHere); 
    clientgui.setVisible(true); 
      } 
     } 

a nd dann ClientGUI Klasse:

public ClientGUI(String username){ 

    //Login login = new Login(); 
    // String username = login.usernameTF.getText(); 

    welcome = new JLabel("Welcome to ChatSystem "+username, SwingConstants.CENTER); 

} 
+0

Dank, es scheint zu funktionieren, aber wenn Sie mir erklären können, warum in dem Konstruktor ein neues Objekt erstellen, das Geschäft nicht tun wäre es hilfreich, – Guest

+0

ist nicht, weil innerhalb von der Konstruktor, es ist, weil Sie eine neue Anmeldung erstellen und das ganze Datum ist neu, und hat nichts mit der Anmeldung zu tun, die Sie vor –

+0

ok habe, verstehe ich jetzt danke. Ich bekomme ein anderes Problem innerhalb meiner Hauptmethode in ClientGUI, wenn ich den Frame wie folgt sichtbar mache: "new ClientGUI (Benutzername) .setVisible (true);" Ich erhalte eine Fehlermeldung, die besagt, dass der Benutzername nicht in eine Variable aufgelöst werden kann. Weißt du, wie das zu beheben ist? Sorry, ich weiß, es muss eine dumme Frage sein, aber ich bin ziemlich neu in Java – Guest

0

die Schaukeln Komponente sind standardmäßig privat müssen Sie sie öffentlich machen von nur kleinen Schritten 1.Go auf die Eigenschaften des Bauteils und dann auf die Registerkarte Code 2. Sie finden Variable Modifier als private machen sie öffentlich und ebenso statisch, wenn Sie möchten.

Sie werden nun in der Lage sein, die Komponenten mit dem gleichen Code

+1

Ich denke nicht, dass das Ändern des Schutzwerts einer Variablen der beste Ansatz wäre, sondern stattdessen das Hinzufügen eines Accessors und Mutators zur Variablen. –

1

Grundsätzlich verwenden Sie eine Observer Pattern verwenden sollten, die ClientGUI können Ereignisse an Interessenten zu generieren, wenn sich etwas ändert.

Dieser entkoppelt Code und verhindert, dass die ClientGUI von Dingen zu tun, sollte es nicht (wie das Etikett zu entfernen oder es ist übergeordnete Komponente zum Beispiel)

Sie einige der eingebauten Hörer verwenden könnten, wenn sie Ihre Bedürfnisse gerecht zu werden, aber für so etwas wie diese, würde ich lieber meine eigene

public class LoginEvent extends EventObject { 

    private Throwable cause; 
    private String userName; 

    public LoginEvent(Object source) { 
     super(source); 
    } 

    public Throwable getCause() { 
     return cause; 
    } 

    public String getUserName() { 
     return userName; 
    } 

} 

public interface LoginListener extends EventListener { 
    public void loginFailed(LoginEvent evt); 
    public void loginSuccessful(LoginEvent evt); 
} 

Dann könnten Sie eine Instanz des Zuhörers zu den ClientGUI hinzufügen verwenden ...

loginB.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     ClientGUI clientgui = new ClientGUI(getTheNameAndpassItHere); 
     clientgui.addLoginListener(new LoginListener() { 
      @Override 
      public void loginFailed(LoginEvent evt) { 
       Throwable cause = evt.getCause(); 
       // Show error message 
      } 

      @Override 
      public void loginSuccessful(LoginEvent evt) { 
       String name = evt.getUserName(); 
       // Update UI 
      } 
     }); 
     clientgui.setVisible(true); 
    } 
} 

oder etwas simular

+0

den Text zu bekommen und ihn durch das ClientGUI zu übergeben, schien zu funktionieren, aber ich bin auch an anderen Möglichkeiten interessiert, dies zu tun. Ich habe ein wenig über Beobachtermuster gelesen, um zu sehen, wie sie funktionieren, aber ich habe nicht viel verstanden (ich bin ein ziemlich neuer Programmierer). Können Sie mir bitte erklären, welchen Vorteil Ihre Methode hat, wenn Sie nur den Text bekommen und ihn (falls vorhanden) durch den Konstruktor schicken? – Guest

+0

Wenn Sie die Bezeichnung der 'ClientGUI' zuordnen, wird die' ClientGUI'; 1- IMMER benötigen Sie ein 'JLabel', so plötzlich, wenn Sie andere Aspekte der Benutzeroberfläche aktualisieren möchten, müssen Sie plötzlich mehr Objekte an sie übergeben. Was passiert, wenn Sie die Benutzeroberfläche nicht mit einem 'JLabel', sondern einem' JTextField' aktualisieren möchten? Sie haben die beiden eng miteinander verbunden, was es schwierig macht, sie zu erweitern oder zu modifizieren. 2- Es liegt nicht wirklich in der Verantwortung des 'ClientGUI', die Benutzeroberfläche auf diese Weise zu aktualisieren; 3- Nicht das 'ClientGUI' kann Dinge zu Ihrer UI machen, die Sie nicht wollten. Nichts hindert sie daran, das Etikett zu entfernen, als Beispiel: – MadProgrammer

+0

hmm, aber übergeben Sie den Namen nicht auch über den ClientGUI-Konstruktor? – Guest

Verwandte Themen