2015-02-12 136 views
0

我有一個應用程序類,如下面直接顯示的那樣,它實例化i)我寫的擴展JFrame並實現ActionListener的UI類,以及ii)一個簡單的「發票」類。前者將被用作接受文本輸入的主界面,用於特定值(「發票號碼」),並將這些值傳遞給後一類(發票)。我想擴展應用程序類(在其中實現main)以允許在其中實現actionPerformed()方法(當然不是在main()內)來監聽UI類中兩個按鈕之一的按下,在事件上創建Purchase類的新實例,然後將這個引用傳遞給單個UI類實例的button.addActionListener()方法。將應用程序類引用傳遞給構造函數(Java)

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 


public class CreatePurchase implements ActionListener { 

boolean isInterface = true; 
CreatePurchase testing = new CreatePurchase(); 
SupportiveJFrame uiFrame = new SupportiveJFrame(testing, "Southwest Invoice Systems", isInterface); 
Purchase firstPurchase = new Purchase(uiFrame, true); 


public static void main(String args[]){ 





} 

public void actionPerformed(ActionEvent e){ 

    Object source = e.getSource(); 

    if(source == uiFrame.newInvoice){ 

     //New object created here 


    } 

}  
} 

我的問題是,如何才能給應用程序類的引用傳遞給UI構造,從而允許它被傳遞給JButton的「NEWOBJECT」?如果我在main()中放置「uiFrame」和「firstPurchase」的初始化,「firstPurchase」將不在actionPerformed(ActionEvent e)的範圍之內。

回答

0

您可以使用關鍵字this來獲取對「當前實例」的引用。我不確定你想把它添加到哪一類,但這裏有一個應該證明這個想法的例子:

public class A { 
    private B owner; 
    public A(B owner) {this.owner = owner;} 

    public void callOwnerDoSomething() {owner.doSomething();} 
} 

public class B { 

    public A theA = new A(this); 

    public static void main(String[] args) { 
     new B().theA.callOwnerDoSomething(); // prints "Hello" 
    } 

    public void doSomething() { 
     System.out.println("Hello"); 
    } 
} 
+0

@AdrianM。不是真的。我發佈的代碼僅用於*演示*如何*可以使用;它不應該像你的代碼。看看'new A(this)'的作品,並且忽略'doSomething'和'callOwnerDoSomething'(這僅僅是爲了演示)。 'doSomething'就像你的代碼中的'actionPerformed'。 – immibis 2015-02-12 00:36:19

+0

這個問題似乎是,如果我想通過actionPerformed(ActionEvent e)中的「firstPurchase」引用,在具有「public void doSomething()」的地方實現,則firstPurchase需要在main ()。然而,因爲初始化這個對象需要創建JFrame擴展類實例,所以我在「firstPurchase」之前初始化它 - 因此,在main()之前,這會導致某些無效的引用被傳遞給uiFrame構造函數儘管沒有拋出異常,程序立即終止。 – 2015-02-12 00:42:20