2014-07-18 3 views
1

필자는 텍스트 형식으로 잘 작동하는 프로그램 용 GUI를 만들기 위해 혼란을 겪었습니다.다른 클래스에서 인스턴스화 된 객체의 메서드 호출

기본적으로 프로그램은 인벤토리를 추적합니다. 제품 이름, 번호, 비용, 수량 등 처음에는 모든 게터와 세터를 다루는 클래스 '항목'만있었습니다. 그런 다음 스캐너 등을 사용하여 각 요소를 체계적으로 입력 할 수있는 텍스트 기반 메뉴를 표시합니다. 나는 내가 조작 할 수있는 모든 Item 객체를 저장하는 Item의 배열을 인스턴스화 할 수 있기 때문에 모든 것이 잘 작동하는 것을 이해합니다. 그러나 모든 것은 main()에서 발생했습니다.

이제 main()에서 처리하고 처리 한 항목의 대부분을 처리하는 Inventory 클래스를 추가로 만들었습니다. 주로 내 ActionListeners 내에서 내 프로그램 전체에서 사용할 수있는 하나의 "Inventory"객체를 만들고 싶습니다. I.E. inventory.displayText (position); 불행히도 내 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 % 확신하지만, 난 그냥 아니에요 그걸로. 너희들이 나를 도울 수 있다면 크게 감사 하겠어!

+0

오류가 발생했습니다. 어떤 오류가 있습니까? 내 GUI 클래스에서 – Sugar

+0

나는 "inv"isnt 인식 된 로컬 변수 때문에 "inv.displayItem (placement)"가 작동하지 않는다는 오류가 발생합니다. – user3721017

답변

0

eventHandler에 인벤토리 객체에 대한 액세스 권한이 없다는 것이 맞지만 매우 쉽게 해결할 수 있습니다. eventHandlerGUI의 내부 클래스입니다. Java에서 정적이 아닌 내부 클래스는 둘러싸는 클래스의 멤버에 액세스 할 수 있습니다 (자세한 내용은 Nested Classes 참조). 즉, GUI에 신고 한 내용은 eventHandler에 표시됩니다. 당신이해야 할 일은

유형 InventoryGUI의 멤버를 만들고, 당신이 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 
    } 
} 
+0

AHA)에 감사드립니다! 고맙습니다!! 이것은 내가 필요한 것입니다. 그리고 너무 단순! 나는 그것이 될 것이라고 알고 있었다. ... – user3721017

+0

지금, 나는 또 다른 문제를 겪었다 고 생각한다. 생성자를 통해 inv 객체를 전달하는이 메서드가 SAME 객체를 편집 할 수 있습니까? 그 클래스 내에서 새로운 inv를 생성하는 것처럼 보이기 때문에 나중에 이러한 변경 사항을 사용하기 위해 mainGUI로 다시 전달해야합니다. – user3721017

0

GUI 클래스에 Inventory의 필드와 설정자를 만들 수 있습니다. 그런 다음 인벤토리를 인스턴스화 한 후 main에서 mainGUI.setInv(inv)으로 전화하면 GUI 클래스가 인벤토리에 액세스 할 수 있습니다. 의 재고 통과

private Inventory inventory; 

public GUI(Inventory inv){ 

     this.inventory = inv; 

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

} 

는 그 다음 GUI의 인스턴스를 변경 :

+0

전 완전히 뒤따를 지 모르겠습니다. GUI 내에서 새 인벤토리 객체를 만들겠습니까? 그런 다음 main() 내에서 getInv() 메소드를 사용하고 GUI에서 호출하여 새 인벤토리 객체를 채 웁니까? – user3721017

+0

새로운 개체는 아니지만 필드는 다음과 같습니다 :'private Inventory inv; '. 그런 다음'GUI '안에'setInv (Inventory inv) {this.inv = inv;}'가 있습니다. 그렇다면 모든 것이 설정되어야합니다. 아니면 다른 답변으로부터 접근 할 수 있고'main'에서'Inventory' 객체를 전달하는 생성자를 생성 할 수 있습니다. – QBrute

0

가장 간단한 방법은 바로 GUI 생성자에 재고를 통과하는 것

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

를이 방법을해야하는 동안 당신을 벗어나게하려면, Model-View-Controller 패턴을 읽고, 이것을 Java Swing에 어떻게 구현하는지 알고 싶을 수도 있습니다.

MVC가로 응용 프로그램을 나눕니다

  • 모델, 또는 응용 프로그램 (인벤토리 개체)
  • 보기의 기본 데이터 또는 데이터에 대한 인터페이스를 (당신의 GUI)
  • 컨트롤러와 뷰와 모델 간의 변경을 조정하는 엔티티 (명확한 컨트롤러를 갖기 위해 비트를 다시 디자인해야 함)
+0

다른 남자가 당신을 때렸지 만, 이것은 정확히 무엇을 찾고, 감사합니다! 또한 Model-View-Controller 패턴을 점검해야합니다. 팁 ( – user3721017

관련 문제