2016-10-12 2 views
0

У меня есть 2 класса, панель входа и панель графического интерфейса. В приведенном ниже коде сказано, что при входе в систему он отображает мой графический интерфейс и скрывает мой Логин. И в какой-то момент он должен снова вспомнить эту панель входа, когда нажата кнопка выхода из системы. Приведенный ниже код приводит к ошибке StackOverFlow. Я знаю, что это значит, но я не знаю, как это исправить. Есть ли лучшее решение для вызова таких методов из другого класса, когда этот «другой класс» должен вызывать что-то тоже в классе, который его вызвал?Как классы могут вызвать методы друг к другу?

//Login Panel 
public class MyPanel1 extends JFrame implements ActionListener{ 
    MyPanel2 p2 = new MyPanel2(); 
    . 
    . 
    public void actionPerformed(ActionEvent e){ 
      //if login is a success 
      setVisible(false); 
      p2.setVisible(true); 
    } 
} 


//GUI Panel 
public class MyPanel2 extends JFrame implements ActionListener{ 
    MyPanel1 p1 = new MyPanel1(); 
    . 
    . 
    public void actionPerformed(ActionEvent e){ 
      //if logout button is clicked 
      setVisible(false); 
      p1.setVisible(true); 
    } 
} 


Мой трассировки стека:

Exception in thread "main" java.lang.StackOverflowError 
    at sun.awt.Win32GraphicsConfig.getBounds(Native Method) 
    at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222) 
    at java.awt.Window.init(Window.java:505) 
    at java.awt.Window.<init>(Window.java:537) 
    at java.awt.Frame.<init>(Frame.java:420) 
    at java.awt.Frame.<init>(Frame.java:385) 
    at javax.swing.JFrame.<init>(JFrame.java:189) 
    at Login.<init>(Login.java:29) 
    at Cashier.<init>(Cashier.java:10) 
    at Login.<init>(Login.java:9) 
    at Cashier.<init>(Cashier.java:10) 
    at Login.<init>(Login.java:9) 
    at Cashier.<init>(Cashier.java:10) 
    at Login.<init>(Login.java:9) 
+0

вы должны избегать таких круговых зависимостей ... а не google о обратных вызовах! –

+0

Можете ли вы разместить трассировку стека, пожалуйста? –

+0

См. Мой отредактированный пост – ryannjeffers

ответ

0

передать ссылку на первой панели в конструктор второй панели.

//Login Panel 
public class MyPanel1 extends JFrame implements ActionListener{ 
    MyPanel2 p2 = new MyPanel2(this); 
    . 
    . 
    public void actionPerformed(ActionEvent e){ 
     //if login is a success 
     setVisible(false); 
     p2.setVisible(true); 
    } 
} 

//GUI Panel 
public class MyPanel2 extends JFrame implements ActionListener{ 
    MyPanel1 p1; 
    public MyPanel2(MyPanel1 parent){ 
     this.p1 = parent; 
    } 
    public void actionPerformed(ActionEvent e){ 
     //if logout button is clicked 
     setVisible(false); 
     p1.setVisible(true); 
    } 
} 
+0

Можете ли вы еще объяснить это? Im довольно довольно смущенно но я получаю идею. ООП для меня все еще нова. – ryannjeffers

+0

@Wingzero есть что-то конкретное, что вы не понимаете? Я не очень хорошо объясняю и знаю, что вы хотите знать, облегчит мне. – Turamarth

Смежные вопросы