Deval Khandelwal
Deval Khandelwal

Reputation: 3548

Call to jFrame from jInternalFrame does not work

I have a main jFrame HomePage.java and many other classes which extend javax.swing.JInternalFrame. One of the classes (JInternalFrame) is Login.java. Now I check whether the password is correct in Login.java and if the password is correct, I load success.java. Now the problem arises when I have to load the success.java page.

I have a function in the HomePage.java whose purpose is to remove all internal frames and load success.java class. The function is as follows :-

public void LogIn(){
    jDesktopPane1.removeAll();
    System.out.println("Pos 2");
    success frame = new success();
    frame.setVisible(true);
    jDesktopPane1.add(frame);
    setContentPane(jDesktopPane1);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {
    }
}

I call the function in the Login.java page as follows :-

System.out.println("Pos 1 ");
(new HomePage()).LogIn();

The logic does not work. But, I receive the output as

Pos 1
Pos 2

which shows that the program flow was correct. I do not get any error also. Another weird factor is that when I calthe same LogIn() function from the menu in the jFrame itself, I get the desired output. Please solve my dilemma. Any help will surely be appreciated!

Upvotes: 1

Views: 156

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

This code:

System.out.println("Pos 1 ");
(new HomePage()).LogIn();

Creates a new HomePage object and calls a method on it. Oh you are certainly calling the correct method, and it's going a HomePage instance, but it's not the correct HomePage instance, not the one that's displayed, because you've created a new one.

Short term solution: get a valid reference to the displayed HomePage instance and call your method on it. You could get it by passing it into the class that needs it as a constructor or method parameter, or you could use SwingUtilities.getWindowAncestor(...).

i.e.,

Window window = SwingUtilities.getWindowAncestor(Login.this);
if (window instanceof HomePage) {
  HomePage validHomePageRef = (HomePage) window;
  validHomePageRef.logIn();
}

Long term solution: don't create spaghetti code with GUI objects changing behaviors of other GUI objects, but instead refactor your code a la MVC or one of its variants, so the GUI can change the model and the other GUI objects can be notified of these changes via listeners and respond if they want.

Upvotes: 2

Related Questions