Одним из важных понятий в ОО является разделение ответственности.
В вашем случае не входит компонент Login
, чтобы решить, какие действия следует предпринять после успешного входа в систему (вы также можете утверждать, что это неудачно).
В этом случае необходимо, чтобы компонент входа в систему сообщал заинтересованным сторонам о состоянии процесса входа в систему. Этого лучше всего достичь, используя что-то вроде шаблона наблюдателя.
В принципе, это означает, что у вас есть какой-то прослушиватель/обратный вызов, который может реагировать на изменения.
В следующем примере я использовал 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();
}
}
Вы никогда не было необходимости для статических данных? Когда-либо? Конечно, использование OP статичным, скорее всего, неверно, но я комментирую ваш empahasis в комментарии «Nothing ... period». – splungebob
@splungebob: Я на 99,9% уверен, что OP не должен использовать статику так, как он делает, что он, вероятно, использует ее, чтобы позволить возможность получать ссылки на объекты в «глобальной» области, что не является веской причиной его использования. Но вы, конечно, правы, что я был очень хреново в своем заявлении и что, вероятно, я должен перефразировать это. Если вы собираетесь использовать что-то статичное, вам лучше оправдать необходимость. –
LOL - Я собирался сказать 99,99%, но зачем раскололи волосы? – splungebob