2011-09-28 101 views
0

時遇到問題只是與訪問另一個類中的方法有關的一個簡單問題。 我知道這聽起來很簡單,但無論我看什麼都可以爲我回答..所以在這裏。在訪問方法

這是一類。(只留在相關位,因爲大多數的其他的東西只是格式化並通過各地值。)

public class ContactManager extends JFrame{ 
    public void getData()throws FileNotFoundException{ 
    ... 
    ... 
     private class thehandler implements ActionListener { 
       public void actionPerformed(ActionEvent event) { 
        if (event.getSource() == viewButton && selectedIndex != -1){ 
         ViewContact view = new ViewContact(); 
         view.pack(); 
       view.setVisible(true); 




public class ViewContact extends JFrame { 
      ... 
      ... 
       private class viewhandler implements ActionListener { 
         public void actionPerformed(ActionEvent event){ 
          if (event.getSource() == updateButton){       
             getData(); //this method i want to use thats in the contact manager window is what im having issues with. 
       } 

我知道的語法是錯誤的訪問方法在另一個班級,我只是想表明我正在努力做什麼。我無法創建聯繫人管理器類的另一個實例,因爲我已經在使用它。:S至少我認爲這是問題所在。 我希望我已經留下了足夠的相關信息,並提前感謝您的幫助。

+0

爲什麼你不能創建你可以創建ContactManager的實例作爲下面的答案。 –

+0

,因爲ContactManager已經初始化,我想從另一個類更新該實例。 – user968366

回答

1

爲什麼不爲ViewContact()創建一個接受對您的ContactManager實例的引用的構造函數?例如:

ViewContact myContact = ViewContact (this); 
-1

您可以調用data()!

您也可以創建另一個ContactManager類實例。

您也可以使用創建ViewContact的實例:

ContactManager m = new ContactManager(); 
JFrame contact = m.new ViewContact(); 

你甚至可以實例thehandler使用此:

ContactManager manager = new ContactManager(); 
    Object b = null; 
    for (Class<?> clazz : ContactManager.class.getDeclaredClasses()) { 
     if (clazz.getSimpleName().equals("thehandler")){ 

      for (Constructor<?> constructor : clazz.getDeclaredConstructors()) { 
       constructor.setAccessible(true); 
       b=constructor.newInstance(manager); 
       break; 
      } 
      break; 
     } 
    } 
+1

編號'm.new ViewContact()'不是有效的Java語法。 –

+1

使用反射來實現這種事情會變得緩慢,容易出錯,很難理解,如果有'SecurityManager'則不太可能工作。像'setAccessible'這樣的調用方法通常是一個非常糟糕的想法,因爲它違反了訪問控制,很可能會導致代碼出乎意料地行爲。除了其他任何東西,你都試圖在每個聲明的構造函數上調用'newInstance',它將拋出除no-arg之外的所有異常。我之前並沒有低調,因爲你顯然不是一個有經驗的程序員,但這個想法太糟糕了。 -1。 –

+0

所以你投票下來,因爲我通過反射顯示了一種方式? –

2

簡短的回答你的問題是,你可以通過適當實例ContactManagerViewManager並調用getData()要求:

class ViewManager extends JFrame { 
    private ContactManager cm; 

    public ViewManager(ContactManager cm) { 
     this.cm = cm; 
    } 

    private class Handler implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      cm.getData(); 
     } 
    } 
} 

較長的答案是,它可能會更好,以你的業務邏輯從您的視圖邏輯中分離出來,並把getData方法爲業務層類:

class DataSource { 
    public Data getData(); 
} 

class ContactManager extends JFrame { 
    private DataSource dataSource; 
    public ContactManager(DataSource dataSource) { 
     ... 
    } 
} 

class ViewContact extends JFrame { 
    private DataSource dataSource; 
    public ViewContact(DataSource dataSource) { 
     ... 
    } 
} 

這樣可以使那些負責獲取/管理類來自負責顯示它的類的數據。這意味着您可以在不影響數據存儲方式的情況下更改視圖,或者您可以更改數據存儲方式而不影響視圖。

+0

謝謝,這將完美的工作!我特別喜歡你更長的答案。 – user968366