こんにちは、私はこの簡単な例を開発しました。 (マンタンの方法に焦点を当て、ログイン情報を共有してください)。
@ 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。プログラム
パッケージ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;
}
}
クラス。
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);
}
}
モデル/ビュー/コントローラについて確認してください。そのユーザー名は、ビューにはなくモデルに含まれています。 – Jan
申し訳ありませんが、私は本当にあなたが意味するものは得られません。 JFrameには、CurrentUserという名前のパブリック変数があります。どのように私はこれを設定できますか? (私はゲッターとセッターを持っています) –
'String email'と' String password'を含む 'LoginInformation'(Model)のようなJavaクラスを作成し、その情報を保存してGUIを更新します(View) – Frakcool