gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:22:40 25 4
gpt4 key购买 nike

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

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

我希望我已经说清楚了。

最佳答案

更新的答案:假设您的三个 JPanel 扩展名为 MyLoginPanelMyWelcomePanelMyFormPanel。我假设您提到的表单是其中的 main 类,而不是构成表单的实际组件。

每个面板都应该照顾自己的组件。

查看下面的代码,您只需查找并用您正在使用的名称替换我的名称。

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

<小时/>
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 ,正如之前在评论中建议的那样。

我给出的建议只是一般性指导,因为我不了解您的具体需求。

关于具有多个窗口(JPanel)的Java程序,如何将它们连接到JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com