多窗口Java程序(JPanel),如何将它们连接到JFrame

多窗口Java程序(JPanel),如何将它们连接到JFrame,java,netbeans,jframe,jpanel,Java,Netbeans,Jframe,Jpanel,我有一个图书馆应用程序,允许用户登录,以及其他许多事情 我真的不知道如何创建多个窗口(视图),例如登录,如果成功,关闭当前窗口并打开其他用户界面 我希望我已经说清楚了。更新的答案:假设您的三个JPanel扩展名分别为MyLoginPanel、MyWelcomePanel和MyFormPanel。我假设您提到的表单将是其中的主要类,而不是构成表单的实际组件 这些面板中的每一个都应注意其自身的组件 查看下面的代码,您只需找到我的名字并将其替换为您正在使用的名字 建议:让您的主类实现一些接口,以侦听三

我有一个图书馆应用程序,允许用户登录,以及其他许多事情

我真的不知道如何创建多个窗口(视图),例如登录,如果成功,关闭当前窗口并打开其他用户界面


我希望我已经说清楚了。

更新的答案:假设您的三个
JPanel
扩展名分别为
MyLoginPanel
MyWelcomePanel
MyFormPanel
。我假设您提到的表单将是其中的主要类,而不是构成表单的实际组件

这些面板中的每一个都应注意其自身的组件

查看下面的代码,您只需找到我的名字并将其替换为您正在使用的名字

建议:让您的主类实现一些接口,以侦听三个不同面板上的更改。例如:用户单击了一些按钮,应用程序将进入下一个面板。那个按钮必须通知某人。有人将是接口的实现者





与直接从
JFrame
添加/删除元素不同,您可能希望在自己的某个内容面板上执行这些操作,该面板存储为实例变量(请参见
JFrame.setContentPane()

如果您希望所有面板都能同时轻松访问,而不是进行这种程序性的逐步更改,您可能需要查看,正如前面在评论中所建议的那样


我给你的建议只是一般性的指导,因为我不知道你需要的细节。

我从来没有使用过多个窗口,我知道如何使用一个窗口,但我不知道我该怎么做,有什么方法可以重新绘制jframe或idk。我有三个JPanel,每个JPanel在不同的文件中,从那里我可以使用一个。或者删除第一个面板,添加第二个面板,然后重新验证。通常情况下,用户将使用JPanels查看视图,而JDialogs用于登录windows。我想问另一件事,它是按照您告诉我的方式工作的,现在我知道如何将JPanels添加到框架中,并对其进行处理等等。但是我有3个不同的类来扩展jpanel,所以我有3个文件,然后我有另一个代表表单的文件,但我不知道如何将它们绑定在一起,因为我必须在login jpanel类中创建操作侦听器,从那里我无法从表单类调用函数。我都搞砸了up@user1870530我已经更新了我的答案。我希望它能消除你的一些困惑。
enum AppState {
    LOGIN, WELCOME, FORM
}
interface ProgressListener {
    void progressFrom(AppState currentState);
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyForm implements Runnable, ProgressListener {
    // instance variables
    private JFrame frame;
    private MyLoginPanel loginPanel;
    private MyWelcomePanel welcomePanel;
    private MyFormPanel formPanel;

    /** Empty constructor of objects of class SomeClassUI. */
    public SomeClassUI() {
        // ...
    }

    /** Interface initialization. */
    @Override
    public void run() {
        // These should handle their own component initialization.
        // They should, at least, receive a reference to the listener.

        loginPanel = new MyLoginPanel(this);
        welcomePanel = new MyWelcomePanel(this);
        formPanel = new MyFormPanel(this);

        frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(loginPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /** */
    @Override
    public void progressFrom(AppState whoTriggeredIt) {
        switch (whoTriggeredIt) {
            case LOGIN:
            frame.setContentPane(welcomePanel);
            frame.pack();
            return;

            case WELCOME:
            frame.setContentPane(formPanel);
            frame.pack();
            return;

            default: return;
        }
    }


    /** */
    public void go() {
        SwingUtilities.invokeLater(this);
    }


    /** */
    public static void main(String[] args) {
        new SomeClassUI().go();
    }
}
class MyLoginPanel extends JPanel implements ActionListener {
    private final ProgressListener listener;

    public MyLoginPanel(ProgressListener listener) {
        // Components, etc.
        this.listener = listener;
    }

        ...

    /** */
    @Override
    public void actionPerformed(ActionEvent e) {
        // Validate login, or whatever.
        // All went well, notify listener to progress.
        this.listener.progressFrom(AppState.LOGIN);
    }
}