Первое предложение: переименуйте getString(String str)
в setString(String str)
, потому что на самом деле вы передаете строку в фрейм.Если вы хотите получить значение тем же методом: это работает, как и ожидалось:
public String setString(String str) {
this.str = str;
return this.str;
}
Но реализовать такой установщик довольно редко.Чистые установщики обычно не возвращают никакого значения.
Конструктор в ViewFrame
имеет две проблемы.Первое - вы не вызываете конструктор суперкласса JFrame
.Это работает немного случайно, потому что JFrame
имеет открытый конструктор по умолчанию.Но в любом случае конструктор подкласса должен всегда вызывать конструктор суперкласса (super()
в вашем случае или super("My ViewFrame")
для титрованного фрейма).
Тогда выражение System.out.println(str)
будет print null
, поскольку str
не инициализируется в это время. Сначала вызывается конструктор (включает печать значения str
, которое изначально null
), , затем , вы вызываете метод и «инициализируете» поле str
.
Попробуйте изменить конструктор на:
public ViewFrame(String str){
super();
this.str = str;
System.out.println(str);
}
и логику контроллера на
ViewFrame v = new ViewFrame("Hello World");
v.setVisible(true);
// ...
Это может дать ожидаемый результат.