多窗口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);
}
}