2014-01-16 40 views
0

我創建具有以下面板的GUI:JPanels以及它們之間處理事件

  1. 持有程序中的所有面板主框架:

    public class Main extends JFrame { 
        private Signup signupForm; 
        private Login login; 
        private UserScreen user; 
        private JPanel cards; 
        private CardLayout cl; 
    
        private static final int INNER_FRAME_WIDTH=800; 
        private static final int INNER_FRAME_HEIGHT=800; 
    
    
    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
        EventQueue.invokeLater(new Runnable() { 
         public void run() { 
          try { 
           Main frame = new Main(); 
           frame.setVisible(true); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
    } 
    
    /** 
    * Create the frame. 
    */ 
    public Main() { 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        setBounds(100, 100, INNER_FRAME_HEIGHT, INNER_FRAME_WIDTH); 
        getContentPane().setLayout(new GridLayout(0, 1, 0, 0)); 
    
        cards = new JPanel(); 
        getContentPane().add(cards); 
    
        cl = new CardLayout(); 
        cards.setLayout(cl); 
    
        login = new Login(); 
        cards.add(login,"login"); 
    
    
        signupForm = new Signup(); 
        cards.add(signupForm,"signup"); 
    
        ActionListener listen = new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         try{ 
          //check for a user with the parameters from userName and password fields . On success create a UserScreen for the current user. 
          //This means that you need to send the User object to the UserScreen c'tor. It should look something like this. Might need to change UserScreen accordingly. 
          user = new UserScreen(); 
          cards.add(user,"user"); 
          cl.show(cards,"user"); 
         } 
         catch (Exception exception){ //TODO: Change to exception thrown from Client constructor 
          //TODO: Have the exception popup the relevant screen. 
         } 
        }  
    
    }; 
    
        login.loginBtn.addActionListener(listen); << Example of setting a button's actionListener from Main. 
    
        setLoginListeners(); 
        setSignupListeners(); 
    } 
    

    }

  2. A登錄面板 - 這是您在打開程序時遇到的屏幕。

  3. 註冊面板 - 當您在登錄面板上按下「註冊」按鈕時,您會看到此屏幕。

  4. 用戶屏幕 - 顯示用戶信息的屏幕。

我遇到這我不知道如何處理的問題:

點擊登錄面板中的「登錄」按鈕後,我想切換到新用戶的屏幕(UserScreen目的)。 由於類登錄沒有訪問UserScreen對象(只有主框架),我不得不從主類設置按鈕的actionListener,這似乎是一個可怕的解決方案(因爲它要求我給主要訪問權限「登錄」面板中的許多字段,以便它可以檢查具有給定用戶名和密碼的用戶是否存在等)。有沒有更好的辦法?

有沒有比我有的更好的解決方案?

+1

你可以實現一個'調解器'。 – nachokk

+1

*「JPanels和處理它們之間的事件」*不要擴展'JPanel',而只是使用一個實例。一旦你弄清楚了,你會意識到這是一個沒有問題的問題。 –

+0

我試圖找到這樣的東西看看這個內容http://stackoverflow.com/questions/10781401/switching-between-screens-in-java-swing.see如果這可以幫助你任何方式 –

回答

1

您應該實現模型 - 視圖 - 控制器模式,不同視圖之間的交互應始終通過控制器。

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

+0

你可以詳細說明怎麼樣? – Shookie

+1

@Sookie看看[**這個**](http://www.oracle.com/technetwork/articles/javase/index-142890.html) –

+0

登錄屏幕(視圖)告訴de控制器登錄信息,控制器進行身份驗證,關閉登錄(視圖),並通過用戶信息(模型)來使主框架(視圖)生效。 – Typo

相關問題