2013-10-28 36 views
0

我最近一直在使用JFrame,並在簡單的登錄,註冊和彈出框架工作,當我有他們在一個類。我想讓它更好,並且不是所有的內容都包裝在一個類中,所以我爲框架,按鈕,面板,變量和主類做了一個類。我的問題是,框架本身工作正常,加載和顯示,但按鈕上的ActionListeners根本不工作。當我點擊一個按鈕時,沒有什麼變化。我對Java相當陌生,對JFrames和JButtons來說也很新。有什麼我可以做的,使這個更簡單,或讓我的代碼看起來更好?代碼將在每一個單獨的類:Java Action不同類的監聽器無法正常工作

現在沒有任何運行,即使是「This is running」在它應該調用LoginScreen()不運行之前。我不確定我爲了做到這一點而改變了什麼?

主類:

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重新編譯:取消選中以獲取詳細信息。

我讀到了你給的鏈接,其中一些沒有意義,但我認爲它大部分都是。就在我開始嘗試讓這個工作之前,我想確保我做到了這個HashMap的權利。

我也有你的許可使用你所做的代碼嗎?我可以自己做類似的東西,但它可能不會很好,很乾淨。

+0

你讓創建的具有相互沒有關係的變量實例。例如,在你的關閉動作偵聽器中,你創建了另一個'frames'實例,它不是屏幕上的實例。 – MadProgrammer

+0

你是指取消聽衆嗎?我有:框架myFrames =新框架()?這裏我只是打電話給我已經做的那個。我不確定你的意思。你可以說得更詳細點嗎? – Molten

+0

在'buttons'類中,在'actionListeners'中創建了3個'myFrames'的新實例,其中沒有任何實例具有任何實際在屏幕上的內容。它總共你做6次... – MadProgrammer

回答

0

基本上,你有一個緊密耦合的意大利麪條,它在目前的狀態,可能無法解開。

你的主要問題是,你所有的地方創造的framespanelsbuttonsvariables新實例的事實。這意味着從應用程序的一部分到下一部分,它們都使用它們自己的這些類的實例,這些實例不相互關聯。

另一個問題是應用程序的這些部分中的很多實際上不應該直接訪問您嘗試訪問的對象。

取而代之,首先將應用程序分解爲可用的組件/元素並定義職責。

例如,UI部件應該收集反饋到系統中進行處理的信息。處理層不應該關心這些信息來自哪裏,只是它符合它的需求。

例如...

以下簡單地產生一個登錄對話框,這將返回一個User的對象,表示用戶名和密碼,在輸入的用戶(這是一個非常基本的例子,所以驗證是光)

登錄對話框不關心登錄過程是如何發生的,只有它只是用於獲取信息

承擔同等的責任,應用程序的任何其他部分需要LoginPane內接入到田間地頭,他們只應關心重新SULT

enter image description here

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

    } 

} 

你應該看看模型 - 視圖 - 控制模式

程序接口

+0

感謝您的迴應,我只是想我所知道的JFrame等不足以正確地做到這一點,我並不是100%的網格包,但我得到了jist。此外,對於公共用戶getUser,你基本上是否返回公共類User中的公共用戶?我真的不知道你能做到這一點。也不是很確定UIManager是什麼..任何關於我應該去哪些地方學習這些東西的建議?這條線也做什麼? int result = JOptionPane.showOptionDialog(null,pane,「Login」,JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE,null,new String [] {「Login」,「Cancel」},0); – Molten

+0

'JOptionPane.showOptionDialog'創建對話框和對話框按鈕 – MadProgrammer

+0

您可以看看[使用Swing創建GUI](http://docs.oracle.com/javase/tutorial/uiswing/),但我也建議你花了一些時間與[學習Java語言](http://docs.oracle.com/javase/tutorial/java/index.html) – MadProgrammer