Java 将值从类传递到JFrame
我在将值从类传递到另一个JFrame之间存在问题 我的代码编写遵循MVC模型。因此,我有一个类是控制器,一个jframe是视图,一个类是模型 我在控制器上有一些句柄进程来获取它的值,我希望将这个值传递给jframe,但不要传递给构造函数。 如何将值从类传递到jframe,当值被传递时,jframe将使用它来处理 例: =======================Java 将值从类传递到JFrame,java,swing,jframe,Java,Swing,Jframe,我在将值从类传递到另一个JFrame之间存在问题 我的代码编写遵循MVC模型。因此,我有一个类是控制器,一个jframe是视图,一个类是模型 我在控制器上有一些句柄进程来获取它的值,我希望将这个值传递给jframe,但不要传递给构造函数。 如何将值从类传递到jframe,当值被传递时,jframe将使用它来处理 例: ======================= public class ViewFrame extends JFrame{ private String str; p
public class ViewFrame extends JFrame{
private String str;
public ViewFrame (){
System.out.println(str);
}
public String getString(String str){
return this.str = str;
}
}
但是它会返回null???第一个建议:将
getString(String str)
重命名为setString(String str)
,因为实际上是将String传递给帧。如果要使用相同的方法接收值:这将按预期工作:
public String setString(String str) {
this.str = str;
return this.str;
}
但是实现这样的setter是非常少见的。纯setter通常不返回任何值
ViewFrame
中的构造函数有两个问题。首先-不要在超类JFrame
上调用构造函数。这是偶然的,因为JFrame
有一个公共默认构造函数。但是无论如何,子类的构造函数应该总是调用超类的构造函数(在您的例子中是super()
,在有标题的框架中是super(“我的视图框架”)
)
然后,表达式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);
// ...
这可能会给你预期的结果。@Andreas\u 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;
}
}
这可能也值得一看。什么是ViewFrame?你是说B?Andreas谢谢但我不需要使用构造函数?我已经用
ViewFrame(String str)
替换了您的构造函数ViewFrame()
,并在我的示例中使用了替换项。我知道,但您使用构造函数,但我不想使用构造函数!非常感谢。
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;
}
}