вызов метода, который находится в главном классе из другого класса

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");
       }
    });
}
Теги:
scope
swing

1 ответ

3
Лучший ответ

Скажем, у вас есть два класса: 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();
  • 0
    я думал о передаче основного класса в другой класс, но прохождение this дает ошибку. при вызове this в основном это объем основных или объем основного класса.
  • 0
    @ PatrickW.McMahon: см. Правки. Если вы получаете ошибку, то, пожалуйста, упростите ваш код (аналогично тому, что я сделал выше) и покажите нам ваш новый код и вашу ошибку / проблему.
Показать ещё 16 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню