2016-04-11 13 views
0

Değişim değişken başka bir nesnenin oluşturucu içinde initiallized bir değişkeni değiştirirken ben sorunlarla karşı karşıya ediyorum

JFrame:

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

     Window tester = new Window(); 
     tester.setPort(validate); 
    } 
} 
: Test sınıfta

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); 
    } 
} 

noob sorusu için üzgünüm, ama Jlabel'in neden burada değişmediğini anlayamıyorum. Ben bütün kod gönderebilir Gerekirse

Teşekkür Yapıcıda

+1

yöntemi Window.setPort() yöntemini kullanarak, orada ne yaptığınızı görmeliyiz ... –

+3

Bunun nedeni, "setPort" un sadece "port" değerini güncellemesi ve "numPort" un güncellenmemesi '. Tahmini olmayan bir cevap istiyorsanız, sormak istediğiniz kodu göndermeniz gerekir. – azurefrog

+0

Diğer düşüncem, "bağlantı noktasının" değerini güncellemenin bir şekilde "numPort" u güncelleyeceğini düşünmenizdir. Bu, http://stackoverflow.com/questions/40480/is-java-pass-by- referans ya da by-pass değer-ile-). – azurefrog

cevap

0

istediğiniz Etiketin değerini ayarlayarak (a sohbet benzeri salıncak uygulama yapmaya çalışıyorum). Ve bu değer mevcut port değerine dayanır. Test sınıfınızda, varsayılan bağlantı noktası değerine sahip yeni bir Pencere örneği oluşturursunuz ve yalnızca bağlantı noktası değerini değiştirirsiniz (ancak, açıkça oluşturulmuş olan Etiketi etkilemez).

Böyle kurucusuna liman parametresini eklemeniz gerekir ya:

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

veya setPort güncellemek() yöntemi:

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

Setport'u setport'a eklediğimde işe yaradı. Teşekkürler! –

0

Sen ancak içeride Pencere sınıfı içinde değerini güncelliyoruz JLabel. Java dizeleri değişmezdir, dolayısıyla yeniden atamanız aslında Windows sınıfındaki değişkeninizin String'in değerini değiştirmek yerine yeni bir String örneğini göstermesine neden olur.

sizin Pencere sınıfı kodu böyle bir şey kullanmayı deneyin:

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

setport yöntemine eklendi, teşekkürler kardeşim! –

0

itiraf etmeliyim ki, öyle bir değil yapıcı içinde gerçek bir iş yapmak tavsiye:

Şimdi, pencere etiketinizin neden değişmemesinin nedeni, aşağıdakileri ana yaptığınızda olmasıdır.

Window tester = new Window(); 

Sizin yapıcı çağrılır ve JLabel zaten "varsayılan" port

ben yani bu size girdi üzerinde daha fazla kontrol verecek bir inşa JLabel geçmesine İmalatcı aşağıdaki güncelleştirmeyi öneriyorum başlatılır.

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

Bu yardımcı olur umarım.

İlgili konular