オブジェクト指向の重要な概念の 1 つは、責任の分離です。
あなたの場合、Login
ログインが成功した後に実行する必要があるアクションを決定するのはコンポーネントの責任ではありません(失敗したと主張することもできます)。
この場合、ログイン コンポーネントが関係者にログイン プロセスの状態を通知する何らかの方法が必要です。これは、オブザーバー パターンのようなものを使用して実現するのが最適です。
基本的に、これは、変更に反応できるある種のリスナー/コールバックがあることを意味します。
次の例では、ビューを切り替える主な手段として を使用しましたが、(Hovercraft が行ったように) ログイン フォームに を使用して、ログインが処理されたらメイン フレームをロードするCardLayout
ことも簡単にできます。JDialog
成功しました。
public class TestCardLogin {
public static void main(String[] args) {
new TestCardLogin();
}
public TestCardLogin() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel implements LoginListener {
private MainPane mainPane;
private LoginPane loginPane;
public TestPane() {
setLayout(new CardLayout());
mainPane = new MainPane();
loginPane = new LoginPane(this);
add(mainPane, "MAIN");
add(loginPane, "LOGIN");
((CardLayout) getLayout()).show(this, "LOGIN");
}
@Override
public void loginSuccessful() {
((CardLayout) getLayout()).show(this, "MAIN");
}
@Override
public void loginFailed() {
JOptionPane.showMessageDialog(TestPane.this, "Login failed", "Error", JOptionPane.ERROR_MESSAGE);
}
}
public class MainPane extends JPanel {
public MainPane() {
JLabel label = new JLabel("Welcome!");
Font font = label.getFont();
label.setFont(font.deriveFont(Font.BOLD, 32));
setLayout(new GridBagLayout());
add(label);
}
}
public class LoginPane extends JPanel {
private JTextField user;
private JPasswordField password;
private JButton login;
private LoginListener loginListener;
public LoginPane(LoginListener listener) {
this.loginListener = listener;
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(4, 4, 4, 4);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.EAST;
add(new JLabel("User name:"), gbc);
gbc.gridy++;
add(new JLabel("Password:"), gbc);
gbc.gridx++;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
user = new JTextField(12);
password = new JPasswordField(12);
add(user, gbc);
gbc.gridy++;
add(password, gbc);
login = new JButton("Login");
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(login, gbc);
login.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean accept = (boolean) (((int) Math.round(Math.random() * 1)) == 0 ? true : false);
if (accept) {
loginListener.loginSuccessful();
} else {
loginListener.loginFailed();
}
}
});
}
}
public interface LoginListener {
public void loginSuccessful();
public void loginFailed();
}
}