调用在另一个类中实例化的对象的方法

时间:2014-07-18 05:03:01

标签: java object user-interface

好吧,伙计,我设法完全混淆了自己试图为我在文本形式上运作良好的程序构建GUI。

本质上该程序跟踪库存。产品名称,数量,成本,数量等。最初我只是有一个班级'项目'它涵盖了所有的吸气剂和二传手。然后我会使用扫描仪等来提示基于文本的菜单,您可以非常系统地输入每个元素。我理解这一切是如何工作的,因为我可以实例化一个存储所有Item对象的Items数组,然后我可以操作它们。所有这些都发生在main()中。

现在我还创建了一个Inventory类,它处理我的main()和之前处理的大部分内容。我想创建一个"库存"然后我可以在整个程序中使用的对象,主要是在我的ActionListeners中。 I.E. inventory.displayText(位置);不幸的是,因为我的GUI是一个独立于我的main()的类 - 我实例化了Inventory类 - 我没有一个本地变量" inventory"所以我得到一个错误。

这似乎应该是荒谬的简单,但我的大脑似乎并没有包裹它。

这个想法:

public class Items{

     all item variables
     setters and getters()

  }

 public class Inventory{

     Items[] arrayOfItems = new Items[10]

     displayItem(int placement){
          ...code to display items

     }

  }

 public class GUI extends JFrame{

       public GUI(){
               ...general gui layout...
               forwardButton = new JButton("Forward");

         }


  private class eventHandler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent event) {

            int placement = 1;


            if (event.getSource()==forwardButton){

                if (placement < 10){
                    placement++;
                    inv.displayItem(placement);   //this is where the problem is and where I
                }                                  //have lost myself. inv doesnt exist here.
                                                   //so i cant call upon the object from here.

public class Company{

    public static void main(String args[]){

        //Open GUI
    GUI mainGUI = new GUI();
    mainGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainGUI.setSize(1000,1000);
    mainGUI.setVisible(true);

    //initialize inventory object
    Inventory inv = new Inventory();

    }

}

我几乎100%肯定它的东西超级基本但我只是没有得到它。如果你们能帮助我,我会非常感激!

3 个答案:

答案 0 :(得分:0)

您可以在GUI类中为Inventory创建一个字段和一个setter。 然后,在实例化您的广告资源后的main中,您只需致电mainGUI.setInv(inv),您的GUI类就可以访问广告资源。

答案 1 :(得分:0)

最简单的方法就是将库存传递给GUI构造函数:

 private Inventory inventory;

 public GUI(Inventory inv){

      this.inventory = inv;

      ...general gui layout...
      forwardButton = new JButton("Forward");

 }

然后更改GUI的实例化以传递库存:

Inventory inv = new Inventory();
GUI mainGUI = new GUI(inv);

虽然这种方法可以帮助您实现这一目标,但您可能希望了解模型 - 视图 - 控制器模式以及如何在Java Swing中实现它。

MVC将应用程序划分为:

  • 模型或应用程序的基础数据(您的库存 对象)
  • 视图或该数据的接口(您的GUI)
  • 控制器,或协调视图和模型之间变化的实体(您需要重新设计一点才能拥有明确的控制器)

答案 2 :(得分:0)

您完全无法访问eventHandler中的广告资源对象,但修复它很容易。 eventHandlerGUI的内部类。事实证明,在Java中,非静态内部类可以访问封闭类的成员(有关更多信息,请参阅Nested Classes)。这意味着您在GUI中声明的所有内容都将显示在eventHandler

您需要做的是创建类型为GUI的{​​{1}}成员,并在创建Inventory时传递您的inv实例。此时,您的GUI将能够看到它。

您的eventHandler构造函数将如下所示......

GUI

...然后在您的public class GUI extends JFrame { private Inventory inv; public GUI(Inventory inv) { this.inv = inv; // other stuff } // etc 方法中,您可以将main()的引用传递给构造函数,如下所示:

inv