我有一个允许用户登录的库应用程序,以及许多其他内容。
我真的不知道如何制作多个窗口(视图),例如登录,如果成功,则关闭当前窗口并打开其他用户界面。
我希望我已经清楚了。
答案 0 :(得分:2)
更新的回答:假设您的三个JPanel
扩展名称为MyLoginPanel
,MyWelcomePanel
和MyFormPanel
。我假设您提到的表单是 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
,如之前在评论中所建议的那样。
我提出的建议只是一般性指导原则,因为我不了解您的需求细节。