У меня есть метод в классе, который содержит основное имя 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");
}
});
}
Скажем, у вас есть два класса: A и B, и вы хотите, чтобы 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 reference
// Allow B 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 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 не создается в статическом мире, тогда передайте свою ссылку в графический интерфейс через свой конструктор, передав this
:
DesktopGUI gui = new DesktopGUI(this); // Note change
frame = gui.getFrame();
this
дает ошибку. при вызовеthis
в основном это объем основных или объем основного класса.