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

时间:2013-05-19 17:20:27

标签: java netbeans jframe jpanel

我有一个允许用户登录的库应用程序,以及许多其他内容。

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

我希望我已经清楚了。

1 个答案:

答案 0 :(得分:2)

更新的回答:假设您的三个JPanel扩展名称为MyLoginPanelMyWelcomePanelMyFormPanel。我假设您提到的表单是 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添加/删除元素,而是将其存储为实例变量(请参阅{ {1}})。

如果您希望所有面板可以同时轻松访问,而不是这个程序逐步更改,您可能需要查看CardLayout,如之前在评论中所建议的那样。

我提出的建议只是一般性指导原则,因为我不了解您的需求细节。