在NetBeans 9.0中,我有两个框架分别为frame1.java
,frame2.java
和主要类为main.java
。
如果我在frame1.java
中将公共变量声明为
public String stringName;
和一个function fn()
,它给出stringName
中frame1
的{{1}}的值,例如"abcd"
。
当我在frame2
中写此内容时,
frame1 fm = new frame1();
String str = frame1.stringName;
System.out.print(str);
我得到的输出为null
。但是我需要的是"abcd"
。
我在做什么错,那应该是什么?
感谢帮助!
修改:
我已将frame1
和frame2
链接起来,以使frame1
的GUI指向frame2
,值也是如此。
编辑2
过程如下:
根据用户的输入,可见frame1
的 GUI >>,函数fn()
存储值,在"abcd"
中说stringName
>>单击{{1 }}导致frame1
>>变量frame2
从str
获取值>> 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
}
}}
答案 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);
}
}