【问题标题】:pass Value from class to JFrame将值从类传递到 JFrame
【发布时间】:2011-01-07 06:23:39
【问题描述】:

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

【问题讨论】:

  • 什么是 ViewFrame?你是说B吗?

标签: java swing jframe


【解决方案1】:

第一个建议:将getString(String str) 重命名为setString(String str),因为实际上您将字符串 传递给 框架。如果您想使用相同的方法接收值:这按预期工作:

public String setString(String str) {
  this.str = str;
  return this.str;
}

但是实现这样的 setter 是非常少见的。纯 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);
   // ...

这可能会给你预期的结果。

【讨论】:

  • Andreas 谢谢,但我不需要使用构造函数?有什么办法可以做到吗?
  • @MYE - 我已将您的构造函数 ViewFrame() 替换为 ViewFrame(String str) 并在我的示例中使用了替换。
  • 我知道但你使用构造函数,但我不想使用构造函数!谢谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2013-12-17
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多