2017-06-06 227 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); 
    } 
}