2014-09-01 6 views
1

У меня есть метод в классе, который содержит основную функцию addNewProduct(String name) В одном из моих JPanels у меня есть JButton, у меня есть actionPerformed(), это в другом классе, называемом DesktopGUI. main создает копию DesktopGUI, и этот объект создает рамку и все компоненты. Я хотел бы иметь способ вызвать методы в основном классе с DesktopGUI.вызов метода, который находится в основном классе из другого класса

основного класс (это строка коды, которые находятся в вопросе. Это не полное представление моего кода. Строки коды также могут быть не в порядке, они были бы в моем реальном приложении.)

public List<Product> productList; 
    public void addNewProduct(String name){ 
     Product product = new Product(); 
     product.setName(name); 
     productList.add(product); 
    } 

    DesktopGUI gui = new DesktopGUI(); 
    frame = gui.getFrame(); 

В конструкторе DesktopGUI он создает и отображает рамку.

в секции кода я есть

SaveButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     System.out.println("Save Button Pressed"); 
     System.out.println("Name: "+(String)fileNameField.getText()); 
     /*the addNewProduct() is located in the class for main*/ 
     addNewProduct((String)fileNameField.getText()); 
    } 
}); 

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

дал простой пример

public class Foo { 
    public List<Product> productList; 
    public static void main(String[] args) { 
     A a = new A(); 

    } 
    public void addNewProduct(String name){ 
     Product product = new Product(); 
     product.setName(name); 
     productList.add(product); 
    } 
} 

class A { 
    SaveButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      foo.addNewProduct("Hello World"); 
     } 
    }); 
} 

ответ

3

Скажем, у вас есть два класса А и В, и вы хотите B позвонить method1() в A, то B нужен действительный экземпляр A для вызова метода выключения из. Например ...

public class Foo { 
    public static void main(String[] args) { 
     A a = new A(); 
     B b = new B(a); // pass A reference into B 

     b.someMethodInB(); 
    } 
} 

class A { 
    // the method that we're interested in! 
    public void method1() { 
     System.out.println("method1 in A"); 
    } 
} 

class B { 
    private A a; //give B a field to hold A's reference 

    // Allow B's constructor to accept the A reference 
    public B(A a) { 
     this.a = a; // and assign it to a field 
    } 

    public void someMethodInB() { 
     a.method1(); // now B can call A's method 
    } 
} 

Редактировать
редактирует на основе кода. Примечание. Добавления, сделанные для создания фрагмента кода , компилируемого. Пожалуйста, помните, чтобы сделать это в следующий раз:

import java.awt.event.*; 
import java.util.List; 
import javax.swing.JButton; 

public class Foo { 
    public List<Product> productList; 

    public static void main(String[] args) { 
     Foo f = new Foo(); 
     A a = new A(f); 

    } 

    public void addNewProduct(String name) { 
     Product product = new Product(); 
     product.setName(name); 
     productList.add(product); 
    } 
} 

class A { 
    private JButton saveButton = new JButton(); 
    private Foo foo; 

    public A(final Foo foo) { 
     this.foo = foo; 
     saveButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      foo.addNewProduct("Hello World"); 
     } 
     }); 
    } 
} 

class Product { 

    public void setName(String name) { 
     // TODO Auto-generated method stub 

    } 

} 

Редактировать 3
Я просто заметил, что вы создаете экземпляр GUI внутри вашего класса ProductList. Часто это делается наоборот, но если это так, как вы хотите это сделать, то, если GUI не создан в мире static, то передайте свою ссылку в GUI через свой конструктор, пройдя через this:

DesktopGUI gui = new DesktopGUI(this); // Note change 
frame = gui.getFrame(); 
+0

Я думал о передаче основного класса в другой класс, но передача 'this' дает ошибку. при вызове 'this' в main это объем основного или объема основного класса. –

+0

@ PatrickW.McMahon: см. Правки. Если вы получаете сообщение об ошибке, пожалуйста, упростите свой код (аналогично тому, что я сделал выше), и покажите нам свой новый код и вашу ошибку/проблему. –

+0

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

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