Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用mvc时,将在不同类上创建的jpanel添加到主视图页面_Java_Swing_Model View Controller_Jframe - Fatal编程技术网

Java 在使用mvc时,将在不同类上创建的jpanel添加到主视图页面

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

我想做的是创建一个通用窗口,其中包含整个程序的所有常用元素(例如菜单栏、背景等),并在单击按钮时添加相应的面板。我在这个项目和视图包上使用MVC模式,我创建了两个类,
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());