0

私は最近 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 を正しく実行したことを確認したいと思います。

また、作成したコードを使用する許可を得ていますか? 私は自分で似たようなものを作ることができましたが、おそらくそれほどきれいではありません.

4

1 に答える 1

0

基本的に、スパゲッティのボウルがしっかりと結合されており、現在の状態では、おそらくもつれを解くことはできません。

framesあなたが抱えている主な問題は、 、panelsbuttonsおよびの新しいインスタンスをあちこちに作成しているという事実ですvariables。これは、アプリケーションのある部分から次の部分まで、すべてがこれらのクラスの独自のインスタンスを使用していることを意味し、それらは互いに関連していません。

もう 1 つの問題は、アプリケーションのこれらの部分の多くが、アクセスしようとしているオブジェクトに直接アクセスする必要がないことです。

代わりに、定義された責任で、アプリケーションを使用可能なコンポーネント/要素に分解することから始めます。

たとえば、UI パーツは、処理のためにシステムにフィードバックされる情報を収集する必要があります。処理レイヤーは、この情報がどこから来たのかを気にする必要はありません。必要に応じているかどうかだけを気にする必要があります。

例えば...

User以下は、ユーザーが入力したユーザー名とパスワードを表すオブジェクトを返すログイン ダイアログを生成するだけです (これは非常に基本的な例なので、検証は簡単です)。

ログイン ダイアログは、ログイン プロセスがどのように発生するかは気にせず、情報の取得のみを担当します。

同様に、アプリケーションの他の部分は 内のフィールドにアクセスする必要LoginPaneはなく、結果のみを気にする必要があります

ここに画像の説明を入力

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 {

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

                }

            }
        });
    }

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

    }

}

Model-View-Control パターンを見てください。

インターフェースするプログラム

于 2013-10-29T06:21:47.207 に答える