GUI Java之间的通信

时间:2013-05-13 18:58:05

标签: java swing events user-interface reference

我有三个类,我创建了JPanels对象,即MyObject扩展了JPanel。我在主方法调用中调用所有三个面板。

 MyObject1 mo1 = new MyObject1(); // contains a textfield and a button
 MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragraph
 MyObject3 mo3 = new MyObject3();

如何让mo1调用mo2上的方法来改变文本区域的文本?

感谢所有人的建议!我要继续接受第一个答案。它解决了我的问题。

更新 其中一个面板是我程序中另外两个面板的组合,这阻碍了我将对象实例传递给某个类的能力。通过删除该面板类并在main中创建一个jpanel然后将两个面板添加到新的jpanel,我能够将类的实例传递给每个构造函数。

反过来我的解决方案是

JPanel panelHolder = new JPanel(); // create a panel in my main instead of a new class
MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragrah
MyObject1 mo1 = new MyObject1(mo2); // contains a textfield and a button
panelHolder.add(mo1);
panelHolder.add(mo2);
MyObject3 mo3 = new MyObject3();

然后在mo2课程中:

private MyObject1 object1;

// constructor for mo2 Class
public MyObject2(MyObject1 object1){

this.object1 = object1; // to get the instance of object1
....// other constructor pieces
}

再次感谢你们!

3 个答案:

答案 0 :(得分:2)

为什么不将对MyObject1实例的引用传递给MyObject2的构造函数?

 MyObject1 mo1 = new MyObject1();
 MyObject2 mo2 = new MyObject2(mo1);

然后,(假设您的方法是公开的或包裹私密的),您只需从mo1.methodName()拨打mo2即可。正如我在评论中提到的,您应该在其构造函数中实例化您计划在mo1中编辑的任何组件,以避免在您从mo2进行调用时出现NullPointerExceptions。

答案 1 :(得分:1)

如何将MyObject1的引用传递给MyObject2

public class MyObject2 extends JPanel
{
    private MyObject1 obj;

    public MyObject2(MyObject1 obj)
    {
        this.obj = obj;
    }
}

然后你的代码将是这样的:

MyObject1 mo1 = new MyObject1();
MyObject2 mo2 = new MyObject2(mo1);

  • 如果您希望每个班级都引用另一个班级怎么办?

  • 简单。只需在MyObject1添加一个setter,例如:

public class MyObject1 extends JPanel
{
    private MyObject2 obj;

    public MyObject1()
    {
        // ...
    }

    public void setMyObject2Reference(MyObject2 obj)
    {
        this.obj = obj;
    }
}

然后:

MyObject1 mo1 = new MyObject1();
MyObject2 mo2 = new MyObject2(mo1);
mo1.setMyObject2Reference(mo2);

答案 2 :(得分:0)

 MyObject1 mo1 = new MyObject1(); // contains a textfield and a button
 MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragrah
 MyObject3 mo3 = new MyObject3();

将其更改为

 MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragrah
 MyObject1 mo1 = new MyObject1(m02); // contains a textfield and a button
 MyObject3 mo3 = new MyObject3();

然后你可以像mo1.getM02()。updateText(“test”);

一样调用