2015-04-01 48 views
2

我一直在嘗試一個很好的UI,因爲我對java很陌生。我已經學會了cardlayout是如何工作的,但是我的JButtons沒有在我的cardlayout中顯示正確的卡片。我正在使用ItemListeners和Actionlisteners來更改cardlayout。這裏是我的代碼...如何使用帶佈局的JButton

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class LoginCards implements ItemListener, ActionListener 
{ 
    JPanel cards; //a panel that uses CardLayout 
    JButton login1; 
    JButton login2; 
    JButton login3; 

    final static String STUDENTPANEL = "Student"; 
    final static String INSTRUCTORPANEL = "Instructor"; 
    final static String DEPTSTAFFPANEL = "Department Staff"; 
    final static String DEPTSTAFFOPTIONS = ""; 
    final static String INSTRUCTOROPTIONS = ""; 
    final static String STUDENTOPTIONS =""; 

    public void addComponentToPane(Container pane) 
    {  
     login1 = new JButton("Login"); 
     login2 = new JButton("Login"); 
     login3 = new JButton("Login");  
     login1.addActionListener(new ActionListener() 
     {   
      public void actionPerformed(ActionEvent e) 
      { 
       CardLayout cl = (CardLayout) (cards.getLayout()); 

       cl.show(cards, STUDENTOPTIONS); 
      } 
     }); 

     login2.addActionListener(new ActionListener() 
     {   
      public void actionPerformed(ActionEvent e) 
      { 
       CardLayout cl = (CardLayout) (cards.getLayout()); 

       cl.show(cards, INSTRUCTOROPTIONS); 
      } 
     }); 

     login3.addActionListener(new ActionListener() 
     {   
      public void actionPerformed(ActionEvent e) 
      { 
       CardLayout cl = (CardLayout) (cards.getLayout()); 

       cl.show(cards, DEPTSTAFFOPTIONS); 
      } 
     }); 

     //Put the JComboBox in a JPanel to get a nicer look. 
     JPanel comboBoxPane = new JPanel(); //use FlowLayout 
     String comboBoxItems[] = { STUDENTPANEL, INSTRUCTORPANEL, DEPTSTAFFPANEL }; 
     JComboBox cb = new JComboBox(comboBoxItems); 

     cb.setEditable(false); 
     cb.addItemListener(this); 
     comboBoxPane.add(cb); 

     //Create the "cards". 
     JPanel card1 = new JPanel(); 

     card1.add(new JLabel("UserName: ")); 
     card1.add(new JTextField("Student UserName", 20)); 
     card1.add(new JLabel("Password: ")); 
     card1.add(new JPasswordField(20)); 
     card1.add(login1); 

     JPanel card2 = new JPanel(); 

     card2.add(new JLabel("UserName: ")); 
     card2.add(new JTextField("Instructor UserName", 20)); 
     card2.add(new JLabel("Password: ")); 
     card2.add(new JPasswordField(20)); 
     card2.add(login2);  

     JPanel card3 = new JPanel(); 

     card3.add(new JLabel("UserName: ")); 
     card3.add(new JTextField("Dept. Staff UserName", 20)); 
     card3.add(new JLabel("Password: ")); 
     card3.add(new JPasswordField(20)); 
     card3.add(login3); 

     JPanel instructorViewCard = new JPanel(); 

     instructorViewCard.add(new JLabel("instructorViewCard")); 

     JPanel deptStaffViewCard = new JPanel(); 

     deptStaffViewCard.add(new JLabel("deptStaffViewCard")); 

     JPanel studentViewCard = new JPanel(); 

     studentViewCard.add(new JLabel("studentViewCard")); 

     //Create the panel that contains the "cards". 
     cards = new JPanel(new CardLayout()); 
     cards.add(card1, STUDENTPANEL); 
     cards.add(card2, INSTRUCTORPANEL); 
     cards.add(card3, DEPTSTAFFPANEL); 
     cards.add(deptStaffViewCard, DEPTSTAFFOPTIONS); 
     cards.add(studentViewCard, STUDENTOPTIONS); 
     cards.add(instructorViewCard, INSTRUCTOROPTIONS);   
     pane.add(comboBoxPane, BorderLayout.PAGE_START); 
     pane.add(cards, BorderLayout.CENTER); 
    } 

    public void itemStateChanged(ItemEvent evt) 
    { 
     CardLayout cl = (CardLayout)(cards.getLayout()); 

     cl.show(cards, (String)evt.getItem()); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event dispatch thread. 
    */ 
    private static void createAndShowGUI() 
    { 
     //Create and set up the window. 
     JFrame frame = new JFrame("OUR System"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     LoginCards demo = new LoginCards(); 

     demo.addComponentToPane(frame.getContentPane()); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     /* Use an appropriate Look and Feel */ 
     try 
     { 
      //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
       UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
     } 
     catch (UnsupportedLookAndFeelException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch (IllegalAccessException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch (InstantiationException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch (ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     /* Turn off metal's use of bold fonts */ 
     UIManager.put("swing.boldMetal", Boolean.FALSE); 

     //Schedule a job for the event dispatch thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     // TODO Auto-generated method stub  
    } 
} 

如果您發現不管你是哪個按鈕(1,2或3),你總是得到相同的卡片佈局標籤「instructorViewCard」。我希望能夠通過login1按鈕等來查看studentViewCard。我只是不確定我錯過了什麼。有沒有人看到答案?有沒有更好的辦法?

回答

3

你沒有給出一個唯一的名稱標識牌的部門的工作人員,教師和學生的選擇......

final static String DEPTSTAFFOPTIONS = ""; 
final static String INSTRUCTOROPTIONS = ""; 
final static String STUDENTOPTIONS = ""; 

這基本上意味着它的使用instructorViewCard爲每個元素的相同觀點(已添加最後一個),因爲卡片由Map內部管理...

+0

謝謝!我會在2分鐘內將此標記爲正確。我只是添加了一些字母來識別它,就像其他人一樣。 idk我覺得沒有這些,我覺得沒問題。 -.- – Layman 2015-04-01 23:55:55

+0

處理新事物時容易做到;) – MadProgrammer 2015-04-01 23:58:07