2012-02-17 12 views
3

3つのクラスに3つのウィンドウがあり、次のボタンをクリックすると次のウィンドウが表示されるようにcardLayoutを使いたいと思います。 1つのcardLayoutに異なる要素を含むJPanelを追加するにはどうすればよいですか?これは最初のウィンドウです:(唯一の違いは、しかし、背景である - しかし、それは私が実際にそれを得た方法のアイデアを表します)他のクラスから他のクラスのJPanelを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); 
    } 
} 

} 

そして最後に1:

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

+0

私はまだそれを働かせることができないので単純に。それでも、問題をスレッド間で結びつけるのは、AWT-EventQueue-0「スレッド例外」です。java.lang.IllegalArgumentException:CardLayoutの親が間違っています。 – Hurdler

+0

あなたのSSCCEにあなたの試みる。だから、質問を再投稿しても、私たちに新しい情報はありません。それは私たちの時間を無駄にするだけです。 – camickr

答えて

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. また、CardLayoutWindowを追加していないようです。あなたは次のことを試すことができます(未承諾)。これが唯一のクラスで必要とされるであろう:

    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.従来のctrl + c&ctrl-v :)。 mainメソッドはWindow1にとどまりますが、各パネルのインスタンスを作成することは私が苦労していることです。 – Hurdler

関連する問題