2012-02-17 75 views
3

我在3個獨立的類中有3個窗口,我想使用cardLayout,以便當您單擊下一個按鈕時,將出現下一個窗口。如何將包含不同元素的JPanel添加到一個cardLayout?這是第一個窗口:(唯一的區別是背景雖然 - 但是它代表了我是如何得到它實際的想法)將其他類的JPanels添加到cardLayout

public class Window1 extends JPanel implements ActionListener { 

static CardLayout cardLayout = new CardLayout(); 

public Window1() { 
    init(); 
} 

private void init() { 
    JPanel jp = new JPanel(new BorderLayout()); 
    JPanel jp2 = new Window2(); 
    //JPanel jp3 = new Window3(); 
    JLabel textLabel = new JLabel("Window1"); 
    jp.setBackground(Color.GREEN); 
    jp.add(textLabel, BorderLayout.CENTER); 
    JButton nextButton = new JButton("NEXT"); 
    nextButton.setActionCommand("next"); 
    nextButton.addActionListener(this); 
    jp.add(nextButton, BorderLayout.EAST); 
    setLayout(cardLayout); 
    add(jp, "string"); 
    add(jp2, "string"); 
    //add(jp3, "string"); 
} 

public void actionPerformed(ActionEvent e) {    
    if (e.getActionCommand().equalsIgnoreCase("next")) { 
    // go to the next window 
     cardLayout.next(this); 
    } 
} 

private static void createAndShowGUI() {   
     JFrame frame = new JFrame("test"); 
     frame.getContentPane().setLayout(Window1.cardLayout); 
     frame.getContentPane().add(new Window1(), "Center"); 
     frame.getContentPane().add(new Window2(), "Center"); 
     frame.getContentPane().add(new Window3(), "Center"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(550, 450); 
     frame.setVisible(true); 
} 


public static void main(String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     }   
    }); 
} 
} 

第二個窗口:

public class Window2 extends JPanel implements ActionListener { 

//static CardLayout cardLayout = new CardLayout(); 

public Window2() { 
    init(); 
} 

private void init() { 
    setLayout(new BorderLayout()); 
    JLabel textLabel = new JLabel("Window2"); 
    setBackground(Color.RED); 
    add(textLabel, BorderLayout.CENTER); 
    JButton nextButton = new JButton("NEXT"); 
    nextButton.setActionCommand("next"); 
    nextButton.addActionListener(this); 
    add(nextButton, BorderLayout.EAST); 
    //setLayout(cardLayout); 
    //JPanel jp3 = new Window3(); 
    //add(jp3, "string"); 
} 

public void actionPerformed(ActionEvent e) {    
    if (e.getActionCommand().equalsIgnoreCase("next")) { 
    // go to the next window?? 
     System.out.println("window2"); 
     Window1.cardLayout.next(this); 
    } 
} 

} 

,最後一個:

public class Window3 extends JPanel implements ActionListener { 

public Window3() { 
    init(); 
} 

private void init() { 
    setLayout(new BorderLayout()); 
    JLabel textLabel = new JLabel("Window3"); 
    setBackground(Color.BLUE); 
    add(textLabel, BorderLayout.CENTER); 
    JButton nextButton = new JButton("NEXT"); 
    nextButton.setActionCommand("next"); 
    nextButton.addActionListener(this); 
    add(nextButton, BorderLayout.EAST); 
} 

public void actionPerformed(ActionEvent e) {    
    if (e.getActionCommand().equalsIgnoreCase("next")) { 
    // go to the next window 
    // Window1.cardLayout.next(this); 
    } 
} 

} 
+0

退出multiposting問題:http://stackoverflow.com/questions/9322474/adding-jpanels-from-other-classes-to-the-cardlayout。你已經從Swing教程中得到了一個有效的例子,並且已經解釋瞭如何將面板與同一個類分開,那麼爲什麼你會重新發布與之前相同的代碼?你沒有聽過你上一篇文章的任何建議。 – camickr 2012-02-17 04:43:45

+0

只是因爲我仍然無法得到它的工作。還有一個問題在於將它連接在一起,我猜,因爲我得到'線程中的異常「AWT-EventQueue-0」java.lang.IllegalArgumentException:CardLayout的父級錯誤「 – Hurdler 2012-02-17 11:34:30

+0

正如我所說,你沒有發佈你的SSCCE顯示你的嘗試。所以重新發布這個問題並沒有給我們任何新的信息。它只會浪費我們的時間。 – camickr 2012-02-17 15:48:52

回答

5

我做了一個小程序,希望寫在程序中的意見,也許能引導你,瞭解如何使用CardLayout。

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

/* Here we are first declaring our class that will act as the 
* base for other panels or in other terms the base for CardLayout. 
*/ 

public class CardLayoutTest 
{ 
    private static final String CARD_JBUTTON = "Card JButton"; 
    private static final String CARD_JTEXTFIELD = "Card JTextField";  
    private static final String CARD_JRADIOBUTTON = "Card JRadioButton"; 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("Card Layout Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     // This JPanel is the base for CardLayout for other JPanels. 
     final JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new CardLayout(20, 20)); 

     /* Here we be making objects of the Window Series classes 
     * so that, each one of them can be added to the JPanel 
     * having CardLayout. 
     */ 
     Window1 win1 = new Window1(); 
     contentPane.add(win1, CARD_JBUTTON); 
     Window2 win2 = new Window2(); 
     contentPane.add(win2, CARD_JTEXTFIELD); 
     Window3 win3 = new Window3(); 
     contentPane.add(win3, CARD_JRADIOBUTTON); 

     /* We need two JButtons to go to the next Card 
     * or come back to the previous Card, as and when 
     * desired by the User. 
     */ 
     JPanel buttonPanel = new JPanel(); 
     final JButton previousButton = new JButton("PREVIOUS"); 
     previousButton.setBackground(Color.BLACK); 
     previousButton.setForeground(Color.WHITE); 
     final JButton nextButton = new JButton("NEXT"); 
     nextButton.setBackground(Color.RED); 
     nextButton.setForeground(Color.WHITE); 
     buttonPanel.add(previousButton); 
     buttonPanel.add(nextButton); 

     /* Adding the ActionListeners to the JButton, 
     * so that the user can see the next Card or 
     * come back to the previous Card, as desired. 
     */ 
     previousButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       CardLayout cardLayout = (CardLayout) contentPane.getLayout(); 
       cardLayout.previous(contentPane); 
      } 
     }); 
     nextButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       CardLayout cardLayout = (CardLayout) contentPane.getLayout(); 
       cardLayout.next(contentPane); 
      } 
     }); 

     // Adding the contentPane (JPanel) and buttonPanel to JFrame. 
     frame.add(contentPane, BorderLayout.CENTER); 
     frame.add(buttonPanel, BorderLayout.PAGE_END); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

class Window1 extends JPanel 
{ 
    /* 
    * Here this is our first Card of CardLayout, which will 
    * be added to the contentPane object of JPanel, which 
    * has the LayoutManager set to CardLayout. 
    * This card consists of Two JButtons. 
    */ 
    private ActionListener action; 

    public Window1() 
    { 
     init(); 
    } 

    private void init() 
    { 
     final JButton clickButton = new JButton("CLICK ME"); 
     final JButton dontClickButton = new JButton("DON\'T CLICK ME");  

     action = new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (ae.getSource() == clickButton) 
       { 
        JOptionPane.showMessageDialog(null, "Hello there dude!" 
               , "Right Button", JOptionPane.INFORMATION_MESSAGE); 
       } 
       else if (ae.getSource() == dontClickButton) 
       { 
        JOptionPane.showMessageDialog(null, "I told you not to click me!" 
                 , "Wrong Button", JOptionPane.PLAIN_MESSAGE); 
       } 
      } 
     }; 

     clickButton.addActionListener(action); 
     dontClickButton.addActionListener(action); 

     add(clickButton); 
     add(dontClickButton); 
    } 
} 

class Window2 extends JPanel implements ActionListener 
{ 
    /* 
    * Here this is our second Card of CardLayout, which will 
    * be added to the contentPane object of JPanel, which 
    * has the LayoutManager set to CardLayout. 
    * This card consists of a JLabel and a JTextField 
    * with GridLayout. 
    */ 

    private JTextField textField; 

    public Window2() 
    { 
     init(); 
    } 

    private void init() 
    { 
     setLayout(new GridLayout(1, 2)); 
     JLabel userLabel = new JLabel("Your Name : "); 
     textField = new JTextField(); 
     textField.addActionListener(this); 

     add(userLabel); 
     add(textField); 
    } 

    public void actionPerformed(ActionEvent e) 
    {    
     if (textField.getDocument().getLength() > 0) 
      JOptionPane.showMessageDialog(null, "Your Name is : " + textField.getText() 
                      , "User\'s Name : ", JOptionPane.QUESTION_MESSAGE); 
    } 
} 

class Window3 extends JPanel 
{ 
    /* 
    * Here this is our third Card of CardLayout, which will 
    * be added to the contentPane object of JPanel, which 
    * has the LayoutManager set to CardLayout. 
    * This card consists of Two JLabels and two JCheckBox 
    * with GridLayout. 
    */ 
    private ActionListener state; 

    public Window3() 
    { 
     init(); 
    } 

    public void init() 
    { 
     setLayout(new GridLayout(2, 2)); 
     JLabel maleLabel = new JLabel("MALE", JLabel.CENTER); 
     final JCheckBox maleBox = new JCheckBox(); 
     JLabel femaleLabel = new JLabel("FEMALE", JLabel.CENTER); 
     final JCheckBox femaleBox = new JCheckBox(); 

     state = new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (maleBox == (JCheckBox) ae.getSource()) 
       { 
        femaleBox.setSelected(false); 
        JOptionPane.showMessageDialog(null, "Congrats you are a Male" 
               , "Gender : ", JOptionPane.INFORMATION_MESSAGE);        
       } 
       else if (femaleBox == (JCheckBox) ae.getSource()) 
       { 
        maleBox.setSelected(false); 
        JOptionPane.showMessageDialog(null, "Congrats you are a Female" 
              , "Gender : ", JOptionPane.INFORMATION_MESSAGE);       
       } 
      } 
     }; 

     maleBox.addActionListener(state); 
     femaleBox.addActionListener(state); 
     add(maleLabel); 
     add(maleBox); 
     add(femaleLabel); 
     add(femaleBox); 
    } 
} 
2

有幾件事情:

  1. 由於您的程序只能運行1 main方法,因此每個班級不需要需要其中一個,但無論您運行哪種方法,都應創建要添加到CardLayout的每個面板的實例。

  2. 您似乎也不會將您的Window s添加到您的CardLayout中。您可以嘗試以下(未編譯)。這將只需要在一個類:

    private static void createAndShowGUI() {   
        JFrame frame = new JFrame("test"); 
        frame.getContentPane().setLayout(Window1.cardLayout); 
        frame.getContentPane().add(new Window1()); 
        frame.getContentPane().add(new Window2()); 
        frame.getContentPane().add(new Window3()); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setSize(550, 450); 
        frame.setVisible(true); 
    } 
    
  3. 而且(這可能只是因爲你的榜樣的簡單),我只想有1級,並會採取小組的名稱,構造函數的背景顏色。這些可以傳入您的init()方法中,並且您的設計會稍微精簡。

+0

3.只爲了這個問題的目的窗戶很簡單,所以他們需要留下來在單獨的課程中。 2.不太明白。我以爲你爲一個窗口設置了一個cardLayout並且只添加了JPanels。 1. Classic ctrl + c&ctrl-v :)。主要方法停留在Window1中,但創建每個面板的實例是我努力的一點。 – Hurdler 2012-02-17 03:54:59