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



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

我真的不知道如何制作多个窗口(视图),例如登录,如果成功,关闭当前窗口并打开另一个用户界面。

我希望我已经说清楚了

更新后的回答:假设您的三个JPanel扩展分别称为MyLoginPanelMyWelcomePanelMyFormPanel。我假设你提到的表单是main类,而不是构成表单的实际组件。

每个面板都应该负责自己的组件。

看看下面的代码,你只需要找到我的名字并用你正在使用的名字替换。

建议:让你的main类实现一些接口,以监听三个不同面板上的变化。例如:用户点击某个按钮,该按钮将使应用程序进展到下一个面板。那个按钮必须通知某人。有人将成为接口的实现者。


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);
    }
}

不是直接从JFrame中添加/删除元素,您可能希望在您自己的内容面板上做这些事情,您将其存储为实例变量(参见JFrame.setContentPane())。

如果你想让所有的面板都可以很容易地访问在同一时间,而不是这个程序性的一步一步的改变,你可能想看看CardLayout,正如之前在评论中建议的。

我所提供的建议只是一般的指导,因为我不了解你们的具体需求。

相关内容

  • 没有找到相关文章

最新更新