更改Java中公共变量的值,由多个框架使用

时间:2018-11-23 08:59:06

标签: java

在NetBeans 9.0中,我有两个框架分别为frame1.javaframe2.java和主要类为main.java。 如果我在frame1.java中将公共变量声明为

public String stringName;

和一个function fn(),它给出stringNameframe1的{​​{1}}的值,例如"abcd"

当我在frame2中写此内容时,

  frame1 fm = new frame1();
  String str = frame1.stringName;
  System.out.print(str);

我得到的输出为null。但是我需要的是"abcd"

我在做什么错,那应该是什么?

感谢帮助!

修改: 我已将frame1frame2链接起来,以使frame1的GUI指向frame2,值也是如此。

编辑2

过程如下:

根据用户的输入,可见frame1

GUI >>,函数fn()存储值,在"abcd"中说stringName >>单击{{1 }}导致frame1 >>变量frame2str获取值>> stringName将值输出为System.out.print(str)

代码

  • 框架1:

    null
  • 第2帧:

    public class frame1 extends javax.swing.JFrame {
    public String stringName;
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
    stringName = jTextField1.getText(); // gets a not null value
    }
    }}
    

2 个答案:

答案 0 :(得分:0)

在类frame2中创建新实例(frame1,fm)的观点。因此,此新实例中字符串的值为null。您需要引用您可能已在主方法中初始化的旧实例吗?

类似的东西:

String str = myOldInstance.stringName;

但是您应该创建一个getter一个setter并将您的var设为私有。 但是为了帮助您,我们需要更多代码。

答案 1 :(得分:0)

在这种情况下,最好的是侦听器模式。 创建侦听器的界面,该界面将提供有关更改文本的信息。在该信息的目标类中,创建此侦听器的实例并返回该实例。在课堂上-信息源-设置侦听器并放在现场。

当您想通知更改文本时,请启动侦听器的方法,然后在第二帧上执行方法的实现。

在下面的示例中-我点击按钮时触发。 无论如何,字段应该是私有的,并添加getter和setter。公共领域是不好的。

主班

public class App {
public static void main(String[] args) {
    Frame1 f1=new Frame1();
    Frame2 f2=new Frame2();

    TextListener textListener = f2.getListener();
    f1.setListener(textListener);
}

}

监听器

public interface TextListener {

public void onTextPropagate(String text);

}

框架类

public class Frame1 extends JFrame{

private TextListener listener;
JButton button;

public Frame1() {
    super("Frame1");
    setBounds(200, 200, 400, 600);
    button=new JButton("Action");
    button.setBounds(100, 200, 200, 100);
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(listener!=null) {
                String text = UUID.randomUUID().toString();
                System.out.println("On Frame1:\t"+text);
                listener.onTextPropagate(text);
            }
        }
    });
    this.add(button);
    setVisible(true);
}

public void setListener(TextListener listener) {
    this.listener=listener;
}

}

public class Frame2 extends JFrame{

public Frame2() {
    super("Frame2");
    setBounds(100, 100, 200, 400);
    setVisible(true);
}

public TextListener getListener() {
    return new TextListener() {

        @Override
        public void onTextPropagate(String text) {
            reactOnChangeText(text);
        }
    };
}

private void reactOnChangeText(String text) {
    System.out.println("On Frame2:\t"+text);
}

}