我有一个图书馆应用程序,允许用户登录,以及许多其他的事情。
我真的不知道如何制作多个窗口(视图),例如登录,如果成功,关闭当前窗口并打开另一个用户界面。
我希望我已经说清楚了
更新后的回答:假设您的三个JPanel
扩展分别称为MyLoginPanel
、MyWelcomePanel
和MyFormPanel
。我假设你提到的表单是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
,正如之前在评论中建议的。
我所提供的建议只是一般的指导,因为我不了解你们的具体需求。