2016-04-11 6 views
0

ich Probleme bin vor, wenn eine Variable zu ändern, die im Konstruktor eines anderen Objektsändern Variable in anderen Klasse

JFrame initiallized ist:

public class Window extends JFrame { 

    private String ip = "default"; 
    private String port = "default"; 
    private String nameClient = "default"; 

    // getters and setters, including setPort ... 

    public void setPort(String port) { 
     this.port = port; 
    } 

    public Window() { 
     JLabel numPort = new JLabel(port); 
     numPort.setBounds(149, 77, 46, 14); 
     add(numPort); 
    } 
} 

In der Testklasse:

public class TestWindow { 
    public static void main(String[] args){ 
     String validate = "1234"; 

     Window tester = new Window(); 
     tester.setPort(validate); 
    } 
} 

Sorry für die noob Frage, aber ich kann nicht verstehen, warum das Jlabel hier nicht ändert. Bei Bedarf ich den ganzen Code schreiben kann (versuchen, einen Chat-ähnlichen Swing app zu machen)

Dank

+1

poste die Methode Window.setPort() ... wir müssen sehen, was du da machst ... –

+3

Ich nehme an, es ist weil 'setPort' nur den Wert von' port' aktualisiert und 'numPort nicht aktualisiert '. Sie müssen jedoch den Code eingeben, über den Sie nachfragen, wenn Sie eine nicht-rate-Antwort wünschen. – azurefrog

+0

Meine andere Vermutung ist, dass Sie denken, dass die Aktualisierung des Wertes von 'port' irgendwie 'numPort' aktualisiert, was nicht der Fall ist (siehe http://stackoverflow.com/questions/40480/is-java-pass-by- Referenz-oder-Weitergabe-Wert). – azurefrog

Antwort

0

In Konstruktor Sie den Wert zu Label setzen. Und dieser Wert basiert auf dem aktuellen Port-Wert. In Ihrer Testklasse erstellen Sie eine neue Window-Instanz mit dem Standard-Port-Wert, und nur dann ändern Sie den Port-Wert (aber das betrifft natürlich nicht bereits erstellte Label).

sollten Sie entweder fügen Sie den Port-Parameter an den Konstruktor wie folgt aus:

public Window(String port) { 
     JLabel numPort = new JLabel(port); 
     numPort.setBounds(149, 77, 46, 14); 
     add(numPort); 
} 

oder aktualisieren Sie Ihre setPort() -Methode:

public void setPort(String port) { 
    this.port = port; 
    numPort.setText(port); 
} 
+0

Ja, als ich den settext in setport hinzugefügt habe, funktionierte es. Vielen Dank! –

0

Sie den Wert innerhalb Window-Klasse zu aktualisieren, aber nicht im Inneren JLabel. Java-Zeichenfolgen sind unveränderlich, sodass Ihre Neuzuweisung dazu führt, dass Ihre Variable in der Windows-Klasse auf eine neue Instanz von String verweist, anstatt den Wert der Zeichenfolge zu ändern.

Probieren Sie etwas wie dies auf dem Window-Klasse Code:

public class Window extends JFrame { 

    private String ip = "default"; 
    private String port = "default"; 
    private String nameClient = "default"; 
    private JLabel numPort; //converted to a instance variable 

    // getters and setters, including setPort ... 

    public void setPort(String port) { 
     this.port = port; 
     numPort.setText(port); 
    } 

    public Window() { 
     numPort = new JLabel(port); 
     numPort.setBounds(149, 77, 46, 14); 
     add(numPort); 
    } 
} 
+0

hinzugefügt in der setport-Methode, danke bro! –

0

Ich muss zugeben, es ist ein nicht wirklich Arbeit in Konstruktor empfohlen zu tun:

Nun, der Grund, warum Ihre Fensterbeschriftung nicht ändert, ist, wenn Sie Folgendes in main tun.

Window tester = new Window(); 

Ihr Konstruktor wird aufgerufen und Ihre JLabel ist bereits mit „default“ Port initialisiert

Ich schlage vor, das folgende Update macht einen konstruierten JLabel Konstruktor heißt passieren dies wird Ihnen mehr Kontrolle über den Eingang geben.

public Window(JLabel label) { 
    ...... 
} 

Hoffe das hilft.

Verwandte Themen