2013-05-13 113 views
0

我有三个类,其中我创建对象是JPanels即MyObject扩展JPanel。我在主要方法调用中调用所有三个面板。GUI之间的通信Java

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上的方法来改变文本区域的文本?

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

更新 其中一个面板是在我的程序的另一两个面板,这是我的妨碍到一个物体的一个实例传递给某一类能力的组合。通过删除该面板类,并在主要创建一个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(); 

,然后在MO 2类:

private MyObject1 object1; 

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

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

再次感谢你们!

+0

你是如何处理这些事件的?我假设当你按下按钮时,mo1有一个事件处理程序。 – 2013-05-13 19:01:26

+0

是的,我为该按钮创建了一个ActionListener,将文本字段设置为使用按钮打开的文件的名称。但我然后想给其他Jpanel整个文件内容。 – 2013-05-13 19:09:24

回答

2

为什么不通过MyObject1实例对构造函数MyObject2的引用?

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

然后,(假设你的方法是公共或包私有的),你可以简单地从mo2调用mo1.methodName()。正如我在评论中提到的那样,您应该在mo1的构造函数中实例化您计划编辑的任何组件,以避免在从mo2拨打电话时发生NullPointerExceptions。

+0

我试图用我的其他面板的实例创建构造函数,但是当我尝试更改文本时遇到空指针异常。 – 2013-05-13 19:02:32

+0

在由其他类编辑之前,您需要实例化在构造函数中编辑的任何组件。 – drewmoore 2013-05-13 19:03:56

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喜欢:

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); 
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( “测试”);