2017-04-06 15 views
0

나는 Java에 익숙하지 않고 Swing에서 CardLayout을 통해 내비게이션을 만들고 있습니다. 기본적으로 나는 JFrame에 두 개의 버튼이 있습니다. 하나의 버튼을 클릭하면 카드 1에 가야합니다. JPanel, card1에 두 개의 버튼을 유지하고 다른 버튼을 클릭하면 카드 2에 가야합니다. JTextField 패널 card2에 있습니다. 그러나 그것은 일어나지 않습니다.CardLayout의 JPanel Swing Java

누구든지 고칠 수 있습니까?

내 코드는 다음과 같습니다.

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

public class CardLayoutTest extends JFrame implements ActionListener { 
    JFrame f; 
    JButton b; 
    JButton c; 
    JPanel panel; 
    JPanel cards; 
    JPanel card1; 
    JPanel card2; 
    CardLayout card; 
    Container pane;  
    final String card1Text = "One"; 
    final String card2Text = "Two"; 

    CardLayoutTest() { 

    } 

    public void passBtn() { 
     f=new JFrame("Card Layout Test"); 

     card1 = new JPanel(); 
     card1.add(new JButton("Button 1 - Card 1")); 
     card1.add(new JButton("Button 2 - Card 1")); 
     card1.setBackground(new Color(255,0,0)); 

     card2 = new JPanel(); 
     card2.add(new JTextField("TextField on Card 2", 20)); 
     card2.setBackground(new Color(0,255,0)); 

     //Create the panel that contains the "cards". 
     cards = new JPanel(new CardLayout()); 
     cards.add(card1, card1Text); 
     cards.add(card2, card2Text); 

     b = new JButton("Page 1"); 
     b.setBounds(50,50,70,30);   
     b.setBackground(Color.red); 

     c = new JButton("Page 2"); 
     c.setBounds(50,80,70,30);   
     c.setBackground(Color.blue); 

     pane = f.getContentPane(); 
     pane.add(cards, BorderLayout.CENTER); 

     b.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e) {          
        card.show(card1, card1Text);      
       } 
     }); 

     c.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) {          
       card.show(card2, card2Text);     
      } 
    }); 
     f.add(b); f.add(c); f.add(panel); f.add(cards); 
    } 

    public static void main(String[] args) {  
     new CardLayoutTest();  
    }  
} 
+0

여기 좀 있었나요 : HTT ps : //docs.oracle.com/javase/tutorial/uiswing/layout/card.html? – XtremeBaumer

+0

'card'를 초기화하지 않으므로 NullPointerExceptions을 얻고 있다고 가정합니다. 어디에서나'card'를 사용하지 마십시오. – VGR

답변

0

시도 :

card = new CardLayout(); 
cards = new JPanel(card); 

대신 cards = new JPanel(new CardLayout());

UPDATE

public class CardLayoutTest extends JFrame { 
JButton b; 
JButton c; 
JPanel cards; 
JPanel card1; 
JPanel card2; 
CardLayout card; 
final String card1Text = "One"; 
final String card2Text = "Two"; 

CardLayoutTest() { 
    super(); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    passBtn(); 
} 

public void passBtn() { 
    card1 = new JPanel(); 
    card1.setBackground(new Color(255,0,0)); 

    card2 = new JPanel(); 
    card2.add(new JTextField("TextField on Card 2", 20)); 
    card2.setBackground(new Color(0, 255, 0)); 

    //Create the panel that contains the "cards". 
    card = new CardLayout(); 
    cards = new JPanel(card); 
    cards.add(card1, card1Text); 
    cards.add(card2, card2Text); 

    b = new JButton("Page 1"); 
    b.setBounds(50, 50, 70, 30); 
    b.setBackground(Color.red); 
    card1.add(b); 
    c = new JButton("Page 2"); 
    c.setBounds(50, 80, 70, 30); 
    c.setBackground(Color.blue); 
    card1.add(c); 
    add(cards); 
    card.show(cards, card1Text); 

    b.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      try { 
       card.show(cards, card1Text); 
      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 
     } 
    }); 

    c.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      try { 
       card.show(cards, card2Text); 
      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 
     } 
    }); 
} 

public static void main(String[] args) { 
    CardLayoutTest cardLayoutTest = new CardLayoutTest(); 
    cardLayoutTest.setVisible(true); 
} 

}

+0

'cards = new JPanel (new CardLayout());의 잘못된 점은 무엇입니까? – c0der

+0

필드에 할당하지 않고 작업에서 리스너가 null 값을 사용합니다. – ZhenyaM

+0

실수로 코드가 가득 찼을 때 코드가 나타납니다. 'cards = new JPanel (new CardLayout()); '은 오류가 아니며 제안한 것을 수행하면 문제가 해결되지 않습니다. – c0der