Java 将值从类传递到JFrame

Java 将值从类传递到JFrame,java,swing,jframe,Java,Swing,Jframe,我在将值从类传递到另一个JFrame之间存在问题 我的代码编写遵循MVC模型。因此,我有一个类是控制器,一个jframe是视图,一个类是模型 我在控制器上有一些句柄进程来获取它的值,我希望将这个值传递给jframe,但不要传递给构造函数。 如何将值从类传递到jframe,当值被传递时,jframe将使用它来处理 例: ======================= public class ViewFrame extends JFrame{ private String str; p

我在将值从类传递到另一个JFrame之间存在问题

我的代码编写遵循MVC模型。因此,我有一个类是控制器,一个jframe是视图,一个类是模型

我在控制器上有一些句柄进程来获取它的值,我希望将这个值传递给jframe,但不要传递给构造函数。 如何将值从类传递到jframe,当值被传递时,jframe将使用它来处理

例:

=======================

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