我在从Class到另一个JFrame的传递值之间存在问题
我的代码编写遵循MVC模型。因此,我有1个类是控制器,一个jframe是视图,1个类是模型。
我在控制器上有一些句柄处理来获取它的值,我希望这个值为jframe但不能通过构造函数传递。 如何将值从类传递到jframe,当值传递时,jframe将使用它来处理。
例如:
public class A{
private String str;
public A(){
}
public void handle(){
ViewFrame v = new ViewFrame();
v.setVisible(true);
v.pack().
v.setSize(330,600);
str = "Hello World"; //init value here
v.getString(str);// pass value to jframe here.
}
}
=======================
public class ViewFrame extends JFrame{
private String str;
public ViewFrame (){
System.out.println(str);
}
public String getString(String str){
return this.str = str;
}
}
但它返回null ??
答案 0 :(得分:1)
第一个建议:将getString(String str)
重命名为setString(String str)
,因为实际上您将字符串传递给。如果您想使用相同的方法接收值:这可以按预期工作:
public String setString(String str) {
this.str = str;
return this.str;
}
但是实现像这样的setter是很常见的。纯粹的制定者通常不会返回任何价值。
ViewFrame
中的构造函数有两个问题。首先 - 你不要在超类JFrame
上调用构造函数。这有点偶然,因为JFrame
有一个公共默认构造函数。但无论如何,子类的构造函数应始终调用超类的构造函数(super()
在您的情况下或super("My ViewFrame")
为标题框架。)
然后,表达式System.out.println(str)
将打印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);
// ...
这可能会给你预期的结果。
答案 1 :(得分:1)
@ Andreas_D的分析是正确的。这是一个更完整的例子,可以提供一些见解。
import javax.swing.JFrame;
import javax.swing.JLabel;
/** @see https://stackoverflow.com/questions/4623020 */
public class A {
private static String str = "Hello, world!";
public static void main(String[] args) {
ViewFrame v = new ViewFrame(str);
v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
v.pack();
v.setLocationRelativeTo(null);
v.setVisible(true);
System.out.println("Equals: " + str.equals(v.getString()));
}
}
class ViewFrame extends JFrame {
private String str;
public ViewFrame(String str) {
this.str = str;
this.add(new JLabel(str, JLabel.CENTER));
}
public String getString() {
return this.str;
}
}
此相关的MVC example也值得一看。