0

У меня есть класс приложения, как показано ниже, который создает объекты из i) класса пользовательского интерфейса, который я написал, который расширяет JFrame и реализует ActionListener, и ii) простой «Счет-фактура», класс. Первый будет использоваться в качестве основного интерфейса, который принимает текстовую запись для определенных значений («номер счета») и передает эти значения последнему классу (счету). Я хотел бы расширить класс приложения (в котором реализована основная функция), чтобы в нем был реализован метод actionPerformed() (не в пределах main()) для прослушивания нажатия одной из двух кнопок в классе UI , создавая новый экземпляр класса Purchase в событии, который, в свою очередь, передаст ссылку «this» на экземпляр button.addActionListener() одного экземпляра класса UI.Передача класса приложения Ссылка на конструктор (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 


    } 

}  
} 

Мой вопрос, как может ссылку на класс приложения передаются в конструктор пользовательского интерфейса, таким образом, что позволяет ему быть передан в JButton «newObject»? Если бы я размещал инициализации «uiFrame» и «firstPurchase» в main(), «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)' works и игнорируйте 'doSomething' и' callOwnerDoSomething' (которые есть только для демонстрации). 'doSomething' похоже на' actionPerformed' в вашем коде. – immibis

+0

Проблема заключается в том, что если я хочу передать ссылку «firstPurchase» из actionPerformed (ActionEvent e), реализованную там же, где у вас есть «public void doSomething()», firstPurchase «необходимо инициализировать вне основного(). Однако, поскольку для инициализации этого объекта требуется создание экземпляра класса расширения JFrame, я инициализировал его перед «firstPurchase» - следовательно, перед main(). Это приводит к некоей недействительной этой ссылке, передаваемой в конструктор uiFrame , хотя никаких исключений не выбрасывается. Программа немедленно прекращается. –

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