当前位置: 首页 > 知识库问答 >
问题:

按下JFrame[重复]中的按钮后打开JPanel

沃侯林
2023-03-14

我创建了一个jframe用于登录,我想在按钮“cont nou”被按下后用jpanel为新帐户打开一个新窗口,但不知道如何用jpanel将初始帧消失和出现。你有什么想法吗?谢谢你!这就是我到现在所做的:

这是jframe,其登录名为:

public class LogIn extends JFrame implements ActionListener{

    private JLabel labelEmail;
    private JLabel labelParola;
    private JTextField textFieldEmail;
    private JPasswordField textFieldParola;
    private JButton buttonLogin;
    private JButton buttonContNou;
    public LogIn (){
        super();
        this.setSize(400,200);
        this.setTitle("Login");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);
        this.setResizable(false);
        this.setupComponents();
    }
    private void setupComponents(){

        labelEmail = new JLabel("Email: ");
        labelParola = new JLabel("Parola: ");
        textFieldEmail = new JTextField();
        textFieldParola = new JPasswordField();
        buttonContNou = new JButton("Cont Nou");
        buttonLogin = new JButton("Login");

        labelEmail.setBounds(30,30,50,20);
        labelParola.setBounds(30,70,50,20);
        textFieldEmail.setBounds(100,30,185,20);
        textFieldParola.setBounds(100,70,185,20);
        buttonContNou.setBounds(185,110,100,20);
        buttonLogin.setBounds(100,110,75,20);

        buttonLogin.addActionListener(this);
        buttonContNou.addActionListener(this);

        this.add(labelEmail);
        this.add(labelParola);
        this.add(textFieldEmail);
        this.add(textFieldParola);
        this.add(buttonLogin);
        this.add(buttonContNou);

    }

   public static void main(String[] args){

       LogIn login= new LogIn();
       login.setVisible(true);
   }

   @Override
   public void actionPerformed(ActionEvent e) {

       if(e.getSource().equals(buttonLogin)){
          boolean toateDateleOk =true;
          textFieldEmail.setBackground(Color.WHITE);
          textFieldParola.setBackground(Color.WHITE);
          if(textFieldEmail.getText().length()==0){
              textFieldEmail.setBackground(Color.RED);
              toateDateleOk =false;
          }
          if(textFieldParola.getPassword().length==0){
              textFieldParola.setBackground(Color.RED);
              toateDateleOk =false;
          }
          if(!toateDateleOk)
              return ;
          else 
             System.out.println("Incepe Procesul de logare");
         if(e.getSource().equals(buttonContNou)){
                //this.dispose();
                //dispose();
                //new NewAccountPanel().setVisible(true);   
                //new secondTab().show();
            }   
         }
   }
}

共有1个答案

闾丘树
2023-03-14

首先,您应该尽可能避免直接从顶级容器(如jframe)进行扩展。这将您绑定到一个单一的use组件,例如,您不能在另一个窗口(作为大型组件层次结构的一部分)或applet上下文中重用登录控件。您也没有向类本身添加任何新功能。

你也应该限制你推到你的用户上的窗口的数量,因为它会很快变得混乱。看看多个JFrames的使用,好/坏的实践?了解更多详情。

相反,您应该考虑使用MVC(Model-View-Controller)设计,以减少类之间的耦合量,并使组件暴露于不需要的/不希望的修改中。

让我们从定义契约开始,这定义流程中的每个元素预期要做什么以及传递的信息

这定义了应用程序中每个视图的核心功能。每个视图都可以有一个控制器(由C定义),并且预期提供一个JComponent作为基表示,该基表示用于将视图物理地添加到容器

public interface View<C> {

    public JComponent getView();
    public void setController(C controller);
    public C getController();

}

这定义了登录视图应该提供什么信息,在本例中,我们提供了用户名和密码信息,以及控制器可以告诉视图登录尝试失败的方法。这允许视图重置视图并在需要时显示错误消息

public interface LoginView extends View<LoginController> {

    public String getUserName();
    public char[] getPassword();

    public void loginFailed(String errorMessage);

}

这定义了login视图的控制器预期会发生的操作,视图调用这些操作来告诉控制器它应该做些什么...

public interface LoginController {

    public void performLogin(LoginView view);
    public void loginCanceled(LoginView view);

}

我没有提供这方面的示例,但您可以想象,您需要提供您想要提供的细节,以便感兴趣的各方从视图中提取细节。

这是基本的loginview实现...

public class LoginPane extends JPanel implements LoginView {

    private JTextField userName;
    private JPasswordField password;
    private JButton okButton;
    private JButton cancelButton;
    private LoginController controller;

    public LoginPane() {
        setLayout(new GridBagLayout());
        userName = new JTextField(10);
        password = new JPasswordField(10);
        okButton = new JButton("Ok");
        cancelButton = new JButton("Cancel");

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(2, 2, 2, 2);
        gbc.anchor = GridBagConstraints.WEST;

        add(new JLabel("User name: "), gbc);
        gbc.gridy++;
        add(new JLabel("Password: "), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        add(userName, gbc);
        gbc.gridy++;
        add(password, gbc);

        gbc.gridwidth = 1;
        gbc.gridy++;
        add(okButton, gbc);
        gbc.gridx++;
        add(cancelButton, gbc);

        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getController().performLogin(LoginPane.this);
            }
        });

        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getController().loginCanceled(LoginPane.this);
            }
        });
    }

    @Override
    public String getUserName() {
        return userName.getText();
    }

    @Override
    public char[] getPassword() {
        return password.getPassword();
    }

    @Override
    public void loginFailed(String errorMessage) {
        JOptionPane.showMessageDialog(this, errorMessage, "Login failed", JOptionPane.ERROR_MESSAGE);
    }

    @Override
    public void setController(LoginController controller) {
        this.controller = controller;
    }

    @Override
    public JComponent getView() {
        return this;
    }

    @Override
    public LoginController getController() {
        return controller;
    }

}

基本应用程序视图

public class ApplicationPane extends JPanel implements View {

    public ApplicationPane() {
        setLayout(new GridBagLayout());
        add(new JLabel("Welcome to my awesome application"));
    }

    @Override
    public JComponent getView() {
        return this;
    }

    @Override
    public void setController(Object controller) {
        // What ever controller you want to use...
    }

    @Override
    public Object getController() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

我们会,这是很多信息,但你怎么用它?

public class CoreApplicationCPane extends JPanel {

    protected static final String LOGIN_VIEW = "View.login";
    protected static final String APPLICATION_VIEW = "View.application";

    private LoginView loginView;
    private ApplicationPane applicationView;
    private CardLayout cardLayout;

    public CoreApplicationCPane() {

        cardLayout = new CardLayout();
        setLayout(cardLayout);

        loginView = new LoginPane();
        applicationView = new ApplicationPane();
        add(loginView.getView(), LOGIN_VIEW);
        add(applicationView.getView(), APPLICATION_VIEW);
        loginView.setController(new LoginController() {

            @Override
            public void performLogin(LoginView view) {
                // Do what ever you need to do...
                String name = view.getUserName();
                char[] password = view.getPassword();
                //...

                cardLayout.show(CoreApplicationCPane.this, APPLICATION_VIEW);
            }

            @Override
            public void loginCanceled(LoginView view) {
                SwingUtilities.windowForComponent(CoreApplicationCPane.this).dispose();
            }
        });

        cardLayout.show(this, LOGIN_VIEW);

    }

}

这基本上是所有东西都插在一起的地方。将LoginViewApplicationView实例化并添加到主视图中,然后插入控制器。

  • 在容器中布局组件
  • 如何使用CardLayout

了解更多详情。

对于更详细的示例,看一下Java和GUI-根据MVC模式,ActionListeners属于哪里?

 类似资料:
  • 我目前正在开发一个聊天程序的登录表单,希望该程序加载框架并等待用户输入。不可饶恕的是,程序打开了框架,但同时又恢复了主方法。我希望你有一些想法来帮助我。 问候语 JFrame类:

  • 我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检

  • 可以使用另一个jFrame的按钮来处理jFrame吗?如果可能的话,这些代码在netbeans中应该是什么样子?

  • 问题内容: 我有一JFrame堂课,它是在Netbeans的设计部分制作的。我正在尝试创建一个登录按钮,该按钮将关闭当前框架并打开另一个框架,无论如何我可以这样做吗? 我努力了: 但我希望它在设计部分中可编辑! 问题答案: 双击NETBEANS中的“登录”按钮,或在Click事件上添加事件监听器(ActionListener)

  • 我必须确保当按下开始游戏按钮时会打开游戏框架。 这是菜单: 这是控制器类: 问题是,当我按下时,我有这个异常: 线程中的异常"AWT-EventQuue-0"java.lang.ClassCast异常:javax.swing.JButton不能转换为javax.swing.JRadioButton

  • 嗨,我有问题打开新窗口fxml视图后单击按钮。主窗口显示,在主视图中我有六个按钮。我想我点击按钮打开新窗口。但是,当我单击按钮时,显示异常: java.lang.Reflect.InvocationTargetException 我尝试在internet上找到的不同解决方案,但显示此异常。主要是尝试在切换函数中修改代码,负责显示新视图。我认为问题出在这里或者是在主类中的代码。