Java 在使用mvc时,将在不同类上创建的jpanel添加到主视图页面
我想做的是创建一个通用窗口,其中包含整个程序的所有常用元素(例如菜单栏、背景等),并在单击按钮时添加相应的面板。我在这个项目和视图包上使用MVC模式,我创建了两个类,Java 在使用mvc时,将在不同类上创建的jpanel添加到主视图页面,java,swing,model-view-controller,jframe,Java,Swing,Model View Controller,Jframe,我想做的是创建一个通用窗口,其中包含整个程序的所有常用元素(例如菜单栏、背景等),并在单击按钮时添加相应的面板。我在这个项目和视图包上使用MVC模式,我创建了两个类,gui(扩展JFrame)和login(JPanel,带文本字段)。单击gui上的login按钮时,应显示loginJPanel public class GUI extends JFrame{ protected JLabel user; protected JButton login; protected
gui
(扩展JFrame
)和login
(JPanel
,带文本字段)。单击gui
上的login
按钮时,应显示login
JPanel
public class GUI extends JFrame{
protected JLabel user;
protected JButton login;
protected JPanel panel;
public GUI(){
FlowLayout layout = new FlowLayout(); // create FlowLayout
Container container = getContentPane(); // get container to layout
setLayout( layout ); // set frame layout
setSize(800,800);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Main Frame");
this.setVisible(true);
panel = new JPanel();
JMenuBar menuBar = new JMenuBar();
JMenu view = new JMenu("View");
JMenu help = new JMenu("Help");
JMenu options = new JMenu("Options");
JMenu file = new JMenu("File");
user = new JLabel("(user not logged)");
user.setForeground(Color.gray);
login = new JButton("Login");
JMenuItem print = new JMenuItem("Print");
this.add(panel);
panel.add(menuBar);
panel.add(user);
panel.add(login);
layout.setAlignment(FlowLayout.RIGHT);
menuBar.add(file);
file.add(print);
menuBar.add(view);
menuBar.add(options);
menuBar.add(Box.createHorizontalGlue());
menuBar.add(help);
setJMenuBar(menuBar);
}
public JButton getButton(){
return login;
}
}
下面是登录
课程代码:
public class Login{
private JButton log;
private JButton clear;
protected JPanel login;
public Login(){
}
public void logIn(){
login = new JPanel();
JLabel userName = new JLabel("User Name: ");
JLabel psd = new JLabel("Password: ");
JTextField user = new JTextField();
JPasswordField password = new JPasswordField();
log = new JButton("Log in");
clear = new JButton("Exit");
login.add(userName);
login.add(psd);
login.add(user);
login.add(password);
login.add(log);
login.add(clear);
}
public JButton getButton(){
return log;
}
}
在这里之前一切都很好。然后在controllers软件包中,我有以下代码:
import java.awt.event.ActionEvent;
import mvc.model.*;
import mvc.view.*;
import java.awt.event.ActionListener;
public class Actions {
private GUI gui;
private Login login;
private ActionListener actionListener;
public Actions(GUI gui, Login login){
this.gui = gui;
this.login = login;
}
public void control(){
actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
loginButtonAction();
}
private void loginButtonAction() {
gui.add(login);//should add the panel but shows an error
}
};
gui.getButton().addActionListener(actionListener);
}
}
它表示,Login
无法转换为popupmenu/component
。
我还尝试为login
类扩展JFrame
,但它说它无法将窗口加载到容器中。
有什么建议吗
它表示登录不能转换为弹出菜单/组件
这个错误是不言自明的。它声明Login
类不是一个正确的类:
public class Login { // it doesn't extend from Component
...
}
您可以添加一个公共方法来返回所需的JPanel
,如下所示:
public class Login{
...
public JPanel getLoginPanel() {
return login;
}
}
Login login = new Login();
Actions actions = new Actions(someGuiInstance, login);
然后在控件
类中进行此更改:
private void loginButtonAction() {
gui.add(login.getLoginPanel());
}
还尝试在登录类上扩展jframe,但它说 无法将窗口加载到容器中 出现此错误是因为扩展自,并且它是顶级容器。因此,不能将其添加到其他容器中
编辑 它在以下位置向我显示一个
NullPointerException
:
public void actionPerformed(ActionEvent actionEvent) {
loginButtonAction();// here's the exception
}
及
gui.add(login.getLoginPanel());
执行此调用时,确保gui
和login
都已正确初始化:gui.add(login.getLoginPanel())
。注意Login
类成员在从外部调用Login()
方法之前不会初始化。所以,如果你这样做:
public class Login{
...
public JPanel getLoginPanel() {
return login;
}
}
Login login = new Login();
Actions actions = new Actions(someGuiInstance, login);
它将抛出一个NPE,因为没有调用
login.login()
方法来初始化它的类成员。它在public void actionPerformed(ActionEvent ActionEvent){loginButtonAction();//这里是异常}
和gui.add上显示了一个NullPointerException(login.getLoginPanel());