2017-06-06 138 views
0

我正在使用NetBeans GUI Builder! 我创建了一个JFrame,并将一个JPanel与一个CardLayout在JPanel之间切换。 JFrame也有一个附有不同选项的菜单。现在我希望这些选项在用户登录前变为灰色。根据登录用户的权限,可以使用选项(请参阅图片以供参考)。 The login panelJava获取登录用户

问题是,我不知道如何在切换面板时获取用户登录的内容。登录面板知道在字段中输入的内容并知道登录是否正确。我已经尝试过使用.getParent()函数来更改Jframe中的变量,但似乎不起作用。但是,我将如何去改变JPanel中的JMenu项目? (见本图片为孩子父母的关系)

Relations

+0

检查模型/视图/控制器 - 该用户名属于模型不进入视图! – Jan

+0

我很抱歉,但我不明白你的意思。在JFrame中,我有一个名为CurrentUser的公共变量。我怎么能设置这个? (我有getters和setters) –

+0

创建一个Java类,例如:'LoginInformation'(Model),它包含'String email'和'String password',然后保存这些信息并用它来更新你的GUI(View) – Frakcool

回答

0

嗨,我开发了这个简单的例子。 (请关注mantain的方式并分享登录信息)。

正如@Jan所建议的,这是MVC模式的粗略实现。您在其中尝试分开: 模型:您正在使用的数据以及用于服务和数据转换的组件层。 查看:从用户 控制器接收数据的组件:与您的模型 这里连接视图的方式,你是一个链接以获取更多信息:

:用于获取登录 The MVC pattern and SWING

package com.stackoverflow.login; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Frame; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import javax.swing.border.LineBorder; 

public class LoginDialog extends JDialog { 

    private static final long serialVersionUID = 1L; 

    // This is the class who will mantain the logged used information 
    private User user; 
    private JTextField tfUsername; 
    private JPasswordField pfPassword; 
    private JLabel lbUsername; 
    private JLabel lbPassword; 
    private JButton btnLogin; 
    private JButton btnCancel; 
    private boolean succeeded; 

    public LoginDialog(Frame parent) { 
     super(parent, "Login", true); 
     // 
     JPanel panel = new JPanel(new GridBagLayout()); 
     GridBagConstraints cs = new GridBagConstraints(); 

     cs.fill = GridBagConstraints.HORIZONTAL; 

     lbUsername = new JLabel("Username: "); 
     cs.gridx = 0; 
     cs.gridy = 0; 
     cs.gridwidth = 1; 
     panel.add(lbUsername, cs); 

     tfUsername = new JTextField(20); 
     cs.gridx = 1; 
     cs.gridy = 0; 
     cs.gridwidth = 2; 
     panel.add(tfUsername, cs); 

     lbPassword = new JLabel("Password: "); 
     cs.gridx = 0; 
     cs.gridy = 1; 
     cs.gridwidth = 1; 
     panel.add(lbPassword, cs); 

     pfPassword = new JPasswordField(20); 
     cs.gridx = 1; 
     cs.gridy = 1; 
     cs.gridwidth = 2; 
     panel.add(pfPassword, cs); 
     panel.setBorder(new LineBorder(Color.GRAY)); 

     btnLogin = new JButton("Login"); 

     btnLogin.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       if (Login.authenticate(getUsername(), getPassword())) { 
        JOptionPane.showMessageDialog(LoginDialog.this, 
          "Hi " + getUsername() + "! You have successfully logged in.", "Login", 
          JOptionPane.INFORMATION_MESSAGE); 
        succeeded = true; 
        user = new User(); 
        user.setPassword(getPassword()); 
        user.setUsername(getUsername()); 
        dispose(); 
       } else { 
        JOptionPane.showMessageDialog(LoginDialog.this, "Invalid username or password", "Login", 
          JOptionPane.ERROR_MESSAGE); 
        // reset username and password 
        tfUsername.setText(""); 
        pfPassword.setText(""); 
        succeeded = false; 

       } 
      } 
     }); 
     btnCancel = new JButton("Cancel"); 
     btnCancel.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       dispose(); 
      } 
     }); 
     JPanel bp = new JPanel(); 
     bp.add(btnLogin); 
     bp.add(btnCancel); 

     getContentPane().add(panel, BorderLayout.CENTER); 
     getContentPane().add(bp, BorderLayout.PAGE_END); 

     pack(); 
     setResizable(false); 
     setLocationRelativeTo(parent); 
    } 

    public String getUsername() { 
     return tfUsername.getText().trim(); 
    } 

    public String getPassword() { 
     return new String(pfPassword.getPassword()); 
    } 

    public boolean isSucceeded() { 
     return succeeded; 
    } 

    public User getUser() { 
     return user; 
    } 

} 

登录服务

package com.stackoverflow.login; 
public class Login { 

    public static boolean authenticate(String username, String password) { 
     // hardcoded username and password 
     if (username.equals("bob") && password.equals("secret")) { 
      return true; 
     } 
     return false; 
    } 
} 

用于保存用户信息级: 包com.stackoverflow.login;

/** 
* Class used to mantain the login information, it's just for educational 
* purpouses, for prod environment you must implement it in a secure way!! 
*/ 
public class User { 

    private String username; 
    private String password; 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

} 

类为运行程序

包com.stackoverflow.login;

import java.awt.Dialog; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

/** 
* Run the program 
*/ 
public class Main { 
    public static void main(String[] args) { 
     final JFrame frame = new JFrame("JDialog Demo"); 
     final JButton btnLogin = new JButton("Click to login"); 
     final JButton btnPanel = new JButton(); 

     LoginDialog loginDlg = new LoginDialog(frame); 
     loginDlg.setVisible(true); 
     // if logon successfully 
     if (loginDlg.isSucceeded()) { 
      btnLogin.setVisible(false); 
      btnPanel.setText("Hi " + loginDlg.getUsername() + "! click to open new frame"); 
      frame.getContentPane().add(btnPanel); 
     } 

     btnPanel.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JLabel label = new JLabel("Logged user is: " + loginDlg.getUser().getUsername()); 
       JDialog mydialog = new JDialog(); 
       mydialog.setSize(new Dimension(400, 100)); 
       mydialog.setTitle("Another frame"); 
       mydialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); 
       mydialog.add(label); 
       mydialog.setVisible(true); 
      } 
     }); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300, 100); 
     frame.setLayout(new FlowLayout()); 
     frame.getContentPane().add(btnLogin); 
     frame.setVisible(true); 
    } 
}