Java 从jInternalFrame调用jFrame无效

Java 从jInternalFrame调用jFrame无效,java,swing,Java,Swing,我有一个主jFrameHomePage.java和许多其他类,它们扩展了javax.swing.JInternalFrame。其中一个类(JInternalFrame)是Login.java。现在,我在Login.java中检查密码是否正确,如果密码正确,则加载success.java。现在,当我必须加载success.java页面时,问题就出现了。 我在HomePage.java中有一个函数,其目的是删除所有内部框架并加载success.java类。功能如下:- public void Log

我有一个主jFrame
HomePage.java
和许多其他类,它们扩展了
javax.swing.JInternalFrame
。其中一个类(JInternalFrame)是
Login.java
。现在,我在
Login.java
中检查密码是否正确,如果密码正确,则加载
success.java
。现在,当我必须加载
success.java
页面时,问题就出现了。

我在
HomePage.java
中有一个函数,其目的是删除所有内部框架并加载success.java类。功能如下:-

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) {
    }
}
System.out.println("Pos 1 ");
(new HomePage()).LogIn();
我在Login.java页面中调用函数,如下所示:-

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) {
    }
}
System.out.println("Pos 1 ");
(new HomePage()).LogIn();
这种逻辑是行不通的。但是,我收到的输出是

Pos 1
Pos 2
这表明程序流程是正确的。我也没有得到任何错误。另一个奇怪的因素是,当我从jFrame本身的菜单中调用相同的
LogIn()
函数时,我得到了所需的输出。请解决我的困境。任何帮助都将不胜感激

此代码:

System.out.println("Pos 1 ");
(new HomePage()).LogIn();
创建一个新的主页对象并对其调用一个方法。哦,您确实调用了正确的方法,它是一个主页实例,但它不是正确的主页实例,不是显示的主页实例,因为您创建了一个新的

短期解决方案:获取对显示的主页实例的有效引用,并对其调用您的方法。您可以通过将它作为构造函数或方法参数传递到需要它的类中来获得它,或者可以使用
SwingUtilities.getWindow祖先(…)

i、 e


长期解决方案:不要用GUI对象更改其他GUI对象的行为来创建意大利面代码,而是用MVC或它的一个变体来重构代码,这样GUI可以更改模型,其他GUI对象可以通过侦听器收到这些更改的通知,并在需要时作出响应。

+1表示SwingUtilities。但如何“有效地引用”主页instance@h2O:他的主页对象似乎是包含GUI所有其他部分的JFrame。如果他得到那个窗口,将它投射到主页变量,他就有访问权。@Puzzler:不客气,但我不得不说,这是一个糟糕的设计。此外,您还需要学习并遵循Java命名约定,包括给出以小写字母开头的方法和变量名,以及以大写字母开头的类名。