将类中的值传递给JFrame

时间:2011-01-07 06:23:40

标签: java swing jframe

我在从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 ??

2 个答案:

答案 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也值得一看。