我是Swing的新手,我对Java的经验也很有限。我正在创建一个GUI但是为了进入主屏幕,首先需要登录。我的课程结构如下:
班级树的根:
public class master {
static mainwindow mainWindow;
static login loginScreen;
static JFrame frame;}
正确的用户名和密码的结果应该将面板从loginscreen切换到mainwindow。我的问题是,当在“登录”类中处理登录操作时,我无法访问我的mainWindow Panel或框架,因为它们位于“更高”的类中。
我希望我所要求的是清楚的,如果不是,我会用更多的代码和详细说明编辑我的帖子。
答案 0 :(得分:3)
您不应该以您的方式使用静态变量或方法,为方法和变量提供全局范围,因为这样做会失去面向对象编程的许多优点。
你应该有一个主类,也许你可以称它为一个控制类,它运行所有东西并将引用传递给它所需要的位置。通常我的登录窗口是模态对话框,例如JDialog,它们是主窗口的模态,是JFrame。
例如,像......
public class MasterControl {
private MainView mainView = new MainView(this);
private LoginView loginView = new LoginView(this);
public MasterControl() {
loginAndStart();
}
private void loginAndStart() {
JFrame frame = new JFrame("MasterControl");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainView.getMainPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
JDialog loginDialog = new JDialog(frame, "Log In", ModalityType.APPLICATION_MODAL);
loginDialog.getContentPane().add(loginView.getMainPanel());
loginDialog.pack();
loginDialog.setLocationRelativeTo(frame);
loginDialog.setVisible(true);
// here extract info from loginView, ask model to validate login credentials
// and then change main view.
}
答案 1 :(得分:3)
OO的一个重要概念是责任分离。
在您的情况下,Login
组件不负责决定成功登录后应采取的操作(您也可以认为不成功)。
在这种情况下,您需要一些方法让登录组件通知感兴趣的各方登录过程的状态。最好使用像观察者模式这样的东西来实现。
基本上,这意味着你有一些可以对变化做出反应的监听器/回调。
在下面的示例中,我使用CardLayout
作为切换视图的主要方法,但您也可以轻松地使用JDialog
作为登录表单(因为Hovercraft已经完成后,一旦登录成功处理,就加载主框架。
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();
}
}