2013-05-13 2 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, изменяя текст текстовой области?

Спасибо за все предложения, ребята! Я собираюсь пойти дальше и принять первый ответ. Это решило мою проблему.

Update Один из этих панелей представляют собой сочетание двух других панелей в моей программе, которая была затрудняющих моя способность передать экземпляр объекта к определенному классу. Удалив этот класс панели и просто создав 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 
} 

снова спасибо, ребята!

+0

Как вы управляете событиями? Я предполагаю, что mo1 имеет обработчик событий, когда вы нажимаете кнопку. – 2013-05-13 19:01:26

+0

Да, я создал ActionListener для кнопки, задает текстовое поле имени файла, который вы открываете с помощью кнопки. но затем я хочу дать другому Jpanel все содержимое файла. –

ответ

2

Почему вы не передаете ссылку на экземпляр MyObject1 на конструктор MyObject2?

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

Затем (при условии, что ваш метод является публичным или частным пакетом), вы можете просто позвонить mo1.methodName() из mo2. Как я уже упоминал в комментариях, вы должны создать экземпляр любых компонентов, которые вы планируете редактировать, в своем конструкторе в mo1, чтобы избежать NullPointerExceptions, когда вы делаете звонок с mo2.

+0

Я попытался создать конструктор с экземпляром моей другой панели, но когда я сделал это, я получаю исключение нулевого указателя при попытке изменить текст. –

+0

Вам нужно будет создать экземпляр любого компонента, редактируемого в конструкторе, прежде чем он будет отредактирован другим классом. – drewmoore

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 ("тест");

Смежные вопросы