gpt4 book ai didi

java - Swing JPanel 切换超出范围

转载 作者:行者123 更新时间:2023-12-01 08:13:42 24 4
gpt4 key购买 nike

我是 Swing 新手,我对 Java 的经验也很有限。我正在创建一个 GUI,但为了进入主屏幕,首先需要登录。我的类(class)结构如下:

类树的根:

public class master {

static mainwindow mainWindow;
static login loginScreen;

static JFrame frame;}

正确的用户名和密码的结果应该将面板从登录屏幕切换到主窗口。我的问题是,当在“登录”类中处理登录操作时,我无法访问我的主窗口面板或框架,因为它们位于“更高”的类中。

我希望我的要求很清楚,如果不是,我会用更多代码和详细说明来编辑我的帖子。

最佳答案

面向对象的重要概念之一是责任分离。

就您而言,Login 组件没有责任决定成功登录后应采取什么操作(您也可以认为不成功)。

在这种情况下,登录组件需要某种方式来通知相关方登录过程的状态。最好使用观察者模式之类的东西来实现这一点。

基本上,这意味着您有某种可以对更改使用react的监听器/回调。

在下面的示例中,我使用 CardLayout 作为切换 View 的主要方式,但您也可以同样轻松地使用 JDialog 来切换 View 。登录表单(就像 Hovercraft 所做的那样)并在登录成功处理后加载主框架。

enter image description here

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();
}
}

关于java - Swing JPanel 切换超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com