我最近一直在使用 JFrame,当我将它们放在一个类中时,我可以使用简单的登录、注册和弹出框。我想让它变得更好,而不是全部打包在一个类中,所以我为框架、按钮、面板、变量和主类创建了一个类。我的问题是框架本身工作正常并且加载和显示,但按钮上的 ActionListeners 根本不工作。当我点击按钮等时没有任何变化。我对 Java 相当陌生,对 JFrames 和 JButtons 也很陌生。我有什么办法可以让这更简单或让我的代码看起来更好吗?代码将在每个单独的类中:
现在什么都没有运行,即使在它应该调用 LoginScreen() 之前的 main 中的“This is running”也没有运行。我不确定我做了什么改变才能做到这一点?
主类:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
public class myGame {
public static void main(String[] args){
buttons myButtons = new buttons();
frames myFrames = new frames();
panels myPanels = new panels();
variables myVariables = new variables();
System.out.println("This is running");
myFrames.loginScreenFrame();
System.out.println("This is also running"); }
}
框架类:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
public class frames{
public JFrame loginScreenFrame(){
variables myVariables = new variables();
panels myPanels = new panels();
buttons myButtons = new buttons();
myVariables.loginFrame.setSize(300,125);
myVariables.loginFrame.setLocation(550,250);
myVariables.loginFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
Container content = myVariables.loginFrame.getContentPane();
content.add(myPanels.loginScreenPanel(), BorderLayout.CENTER);
content.add(myPanels.loginScreenButtonsPanel(), BorderLayout.SOUTH);
myButtons.registerButton.addActionListener(myButtons.registerListener);
myVariables.loginFrame.setVisible(true);
return myVariables.loginFrame;
}
public JFrame registerFrame(){
variables myVariables = new variables();
panels myPanels = new panels();
myVariables.registerFrame.setSize(400,125);
myVariables.registerFrame.setLocation(550,250);
myVariables.registerFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container content = myVariables.registerFrame.getContentPane();
content.add(myPanels.registerScreenPanel(), BorderLayout.CENTER);
content.add(myPanels.registerScreenButtonsPanel(), BorderLayout.SOUTH);
myVariables.registerFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
myVariables.registerFrame.setVisible(true);
return myVariables.registerFrame;
}
}
按钮类:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
public class buttons{
JButton loginButton = new JButton("Login");
JButton registerButton = new JButton("Register");
JButton cancelButton = new JButton("Cancel");
JButton checkUsernameButton = new JButton("Check Username");
public void actionListeners(){
variables myVariables = new variables();
frames myFrames = new frames();
panels myPanels = new panels();
ActionListener cancelListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
frames myFrames = new frames();
myFrames.registerFrame().dispose();
}
};
ActionListener usernameListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
}
};
ActionListener passwordListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
}
};
ActionListener passwordCheckListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
}
};
ActionListener checkUsernameListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
variables myVariables = new variables();
if (myVariables.usernameAndPassword.get(myVariables.username) == null){
JPanel okButtonPanel = new JPanel();
final JFrame invalidUsernameFrame = new JFrame();
invalidUsernameFrame.setSize(400,75);
invalidUsernameFrame.setLocation(550,250);
JButton okButton = new JButton("Ok");
Container invalidUsernameContainer = invalidUsernameFrame.getContentPane();
okButtonPanel.add(okButton);
JLabel invalidUsernameLabel = new JLabel();
invalidUsernameLabel.setText(" Username is Available!");
invalidUsernameContainer.add(invalidUsernameLabel);
invalidUsernameContainer.add(okButtonPanel, BorderLayout.SOUTH);
invalidUsernameFrame.setVisible(true);
ActionListener okListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
myGame mainClass = new myGame();
invalidUsernameFrame.dispose();
}
};
okButton.addActionListener(okListener);
}
else{
JPanel okButtonPanel = new JPanel();
final JFrame invalidUsernameFrame = new JFrame();
invalidUsernameFrame.setSize(400,75);
invalidUsernameFrame.setLocation(550,250);
JButton okButton = new JButton("Ok");
Container invalidUsernameContainer = invalidUsernameFrame.getContentPane();
okButtonPanel.add(okButton);
JLabel invalidUsernameLabel = new JLabel();
invalidUsernameLabel.setText(" Username is not Available");
invalidUsernameContainer.add(invalidUsernameLabel);
invalidUsernameContainer.add(okButtonPanel, BorderLayout.SOUTH);
invalidUsernameFrame.setVisible(true);
ActionListener okListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
myGame mainClass = new myGame();
invalidUsernameFrame.dispose();
}
};
okButton.addActionListener(okListener);
}
}
};
ActionListener registerListener = new ActionListener(){
public void actionPerformed(ActionEvent ae){
frames myFrames = new frames();
myFrames.registerFrame();
}
};
cancelButton.addActionListener(cancelListener);
myVariables.usernameField.addActionListener(usernameListener);
myVariables.passwordField.addActionListener(passwordListener);
myVariables.passwordCheckField.addActionListener(passwordCheckListener);
registerButton.addActionListener(registerListener);
checkUsernameButton.addActionListener(checkUsernameListener);
}
}
面板类:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class panels{
buttons myButtons = new buttons();
frames myFrames = new frames();
variables myVariables = new variables();
public JPanel loginScreenPanel(){
buttons myButtons = new buttons();
frames myFrames = new frames();
variables myVariables = new variables();
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2,2));
panel.add(new JLabel("Username:"));
panel.add(myVariables.usernameFrame);
panel.add(new JLabel("Password:"));
panel.add(myVariables.passwordFrame);
return panel;
}
public JPanel loginScreenButtonsPanel(){
JPanel buttons = new JPanel();
buttons.add(myButtons.loginButton);
buttons.add(myButtons.registerButton);
buttons.add(myButtons.cancelButton);
return buttons;
}
public JPanel registerScreenPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3,2));
panel.add(new JLabel("Username:"));
panel.add(myVariables.usernameField);
panel.add(new JLabel("Password:"));
panel.add(myVariables.passwordField);
panel.add(new JLabel("Re-Enter Password:"));
panel.add(myVariables.passwordCheckField);
return panel;
}
public JPanel registerScreenButtonsPanel(){
JPanel buttons = new JPanel();
buttons.add(myButtons.registerButton);
buttons.add(myButtons.checkUsernameButton);
buttons.add(myButtons.cancelButton);
return buttons;
}
}
新代码:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ExampleGame {
java.util.HashMap<String,char[]> usernamesAndPasswords = new java.util.HashMap<String,char[]>();
public static void main(String[] args) {
new ExampleGame();
}
public ExampleGame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
LoginPane pane = new LoginPane();
storeInfo info = new storeInfo();
int result = JOptionPane.showOptionDialog(null, pane, "Login", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, new String[]{"Login", "Cancel"}, 0);
if (result == 0) {
User user = pane.getUser();
// Perform the login...
usernamesAndPasswords = info.storeInfo(user.name, user.password, usernamesAndPasswords);
System.out.println("Name entered: " + user.name);
System.out.print("Password entered: ");
System.out.println(user.password);
System.out.println(usernamesAndPasswords.get(user.name));
}
}
});
}
public class LoginPane extends JPanel {
private JTextField userName;
private JPasswordField password;
public LoginPane() {
userName = new JTextField(10);
password = new JPasswordField(10);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.anchor = GridBagConstraints.EAST;
add(new JLabel("Username:"), gbc);
gbc.gridx++;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(userName, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.fill = GridBagConstraints.NONE;
add(new JLabel("Password:"), gbc);
gbc.gridx++;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(password, gbc);
}
public User getUser() {
return new User(userName.getText(), password.getPassword());
}
}
public class User {
private String name;
private char[] password;
public User(String name, char[] password) {
this.name = name;
this.password = password;
}
}
public class storeInfo{
public java.util.HashMap storeInfo(String name, char[] password, java.util.HashMap <String, char[]> usernamesAndPasswords){
usernamesAndPasswords.put(name, password);
return usernamesAndPasswords;
}
}
}
我在您的示例中添加了一个类,以使其将值存储在 HashMap 中,我想知道我是否做对了,或者是否有其他更好的方法可以做到这一点?现在它确实将值存储在 HashMap 中,但它给了我一个警告: 注意:ExampleGame.java 使用未经检查或不安全的操作。注意:使用 -Xlint:unchecked 重新编译以获取详细信息。
我阅读了您提供的链接,其中一些没有意义,但我认为大部分情况下确实如此。就在我开始尝试让它工作之前,我想确保我做对了 HashMap。
我也有你的许可使用你制作的代码吗?我可以自己制作类似的东西,但它可能不会那么好和干净。