Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用在另一个类中实例化的对象的方法_Java_Object_User Interface - Fatal编程技术网

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

Java 调用在另一个类中实例化的对象的方法,java,object,user-interface,Java,Object,User Interface,好了,伙计们,我试图为一个文本格式的程序构建一个GUI,这让我完全困惑 基本上,该程序跟踪库存。产品名称、编号、成本、数量等。最初我只是有一个“Items”类,它涵盖了所有的getter和setter。然后我会使用扫描仪等来提示一个基于文本的菜单,您可以非常系统地输入每个元素。我理解这一切是如何运作良好的,因为我可以实例化一个项目数组,该数组存储了我可以操作的所有项目对象。然而,所有这些都发生在main()中 现在,我另外创建了一个Inventory类,它处理我的main()和以前处理过的大部分

好了,伙计们,我试图为一个文本格式的程序构建一个GUI,这让我完全困惑

基本上,该程序跟踪库存。产品名称、编号、成本、数量等。最初我只是有一个“Items”类,它涵盖了所有的getter和setter。然后我会使用扫描仪等来提示一个基于文本的菜单,您可以非常系统地输入每个元素。我理解这一切是如何运作良好的,因为我可以实例化一个项目数组,该数组存储了我可以操作的所有项目对象。然而,所有这些都发生在main()中

现在,我另外创建了一个Inventory类,它处理我的main()和以前处理过的大部分内容。我想创建一个“库存”对象,然后可以在整个程序中使用,主要是在ActionListeners中。即库存显示文本(位置);不幸的是,因为我的GUI与main()是一个单独的类,我在main()中实例化Inventory类,所以我没有局部变量“Inventory”,所以我得到了一个错误

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

我的想法是:

public class Items{

     all item variables
     setters and getters()

  }



我几乎100%肯定这是一个超级基本的东西,但我就是不明白。如果你们能帮我,我会非常感激的

您可以在GUI类中为
库存创建字段和setter

然后,在实例化清单后的
main
中,只需调用
mainGUI.setInv(inv)
,GUI类就可以访问清单。

最简单的方法就是将清单传递到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);
虽然这种方法应该可以让您起步,但您可能希望了解模型-视图-控制器模式以及如何在中实现它

MVC将应用程序分为:

  • 模型或应用程序的基础数据(库存 (对象)
  • 视图或该数据的接口(GUI)
  • 控制器,或在视图和模型之间协调更改的实体(需要重新设计一点以获得清晰的控制器)

您完全正确,在
eventHandler
中您没有访问库存对象的权限,但修复它相当容易
eventHandler
GUI
的一个内部类。事实证明,在Java中,非静态内部类可以访问封闭类的成员(有关更多信息,请参阅)。这意味着您在
GUI
中声明的任何内容都将在
eventHandler
中可见

您需要做的是创建
GUI
类型的
Inventory
的成员,并在创建
GUI
时将
inv
实例传入。此时,您的
eventHandler
将能够看到它

您的
GUI
构造函数将如下所示

public class GUI extends JFrame {
    private Inventory inv;

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

public class Company{
    public static void main(String args[]){
        //initialize inventory object
        Inventory inv = new Inventory();

        //Open GUI
        GUI mainGUI = new GUI(inv);
        //etc
    }
}

你会得到一个错误。哪个错误?在我的GUI类中,我得到一个错误,“inv.displayItem(placement)”不起作用,因为“inv”不是一个可识别的局部变量。我不确定我是否完全遵循了这个错误。您的意思是在GUI中创建一个新的库存对象吗?然后在main()中使用getInv()方法并在GUI中调用它来填充新的库存对象?不是一个新对象,而是一个字段,如下所示:
private inventory。然后在
GUI
a
setInv(Inventory inv){this.inv=inv;}
。那你应该准备好了。或者,您也可以从其他答案中执行该方法,并创建一个构造函数,在其中从
main
传递
Inventory
对象。啊哈!!!非常感谢。这正是我需要的。这么简单!我知道会是……现在,我想我遇到了另一个问题。这个通过构造函数传递inv对象的方法是否允许我编辑相同的对象?因为它似乎是在该类中创建了一个新的inv,然后我必须将其传递回我的mainGUI,以便稍后使用这些更改。另一个家伙击败了你,但这正是我要找的,谢谢!我还将检查模型-视图-控制器模式。谢谢你的提示
Inventory inv = new Inventory();
GUI mainGUI = new GUI(inv);
public class GUI extends JFrame {
    private Inventory inv;

    public GUI(Inventory inv) {
        this.inv = inv;
        // other stuff
    }
    // etc
public class Company{
    public static void main(String args[]){
        //initialize inventory object
        Inventory inv = new Inventory();

        //Open GUI
        GUI mainGUI = new GUI(inv);
        //etc
    }
}