私は最近 JFrame を使用しており、単純なログイン、登録、およびポップアップ フレームが単一のクラスで動作していました。すべてを 1 つのクラスに詰め込むのではなく、より良くしたかったので、フレーム、ボタン、パネル、変数、およびメイン クラスのクラスを作成しました。私の問題は、フレーム自体は正常に機能し、ロードして表示していますが、ボタンの 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 を正しく実行したことを確認したいと思います。
また、作成したコードを使用する許可を得ていますか? 私は自分で似たようなものを作ることができましたが、おそらくそれほどきれいではありません.