2013-08-08 4 views
0

Я пишу простую программу, используя CardLayout. На главном экране должна отображаться кнопка, которая при нажатии переходит к следующему экрану, который содержит другую кнопку для другого экрана. Моя проблема в том, что когда я запускаю свою программу, экран черный. Я пробовал следующие учебники онлайн, чтобы написать свою собственную программу, но, похоже, я не нашел проблему с моим кодом. При запуске я не получаю никаких ошибок. Вот мой кодкак показать другой экран

//using CardLayout to change screen when action is performed 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JLabel; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.Popup; 
import javax.swing.JOptionPane; 

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.FlowLayout; 

public class CL extends JFrame { 

    JPanel cardPanel; 
    JPanel cardPanelA; 
    JPanel cardPanelB;//to set different screens 
    CardLayout cl; 
    private JButton button1; 
    private JButton button2; 
    private JButton change; 
    private JLabel label; 
    private JTextField textField1; 
    private JTextField textField2; 
    JButton button; 

    public CL() { 
     super("This is a sample"); 

     cardPanel = new JPanel(); 
     cardPanelA = new JPanel(); 
     cardPanelB = new JPanel(); 

     cl = new CardLayout(); 
     cardPanel.setLayout(cl); 

     button1 = new JButton("button1"); 
     button2 = new JButton("button2"); 
     change = new JButton("change screen"); 
     label = new JLabel("this is a label"); 
     textField1 = new JTextField(10); 
     textField2 = new JTextField("enter text", 6); 

     cardPanelA.add(change); 
     cardPanelA.add(label); 
     cardPanelA.add(textField1); 
     cardPanelA.add(textField2); 
     cardPanelB.add(button1); 
     cardPanelB.add(button2); 

     cardPanel.add(cardPanelA); 
     cardPanel.add(cardPanelB); 

     JPanel panel1 = new JPanel(); 
     button = new JButton("initial button"); 
     panel1.add(button); 

     theHandler handler = new theHandler();//make action listener 
     change.addActionListener(handler); 
     button1.addActionListener(handler); 
     button2.addActionListener(handler); 
     button.addActionListener(handler); 
     /* 
     getContentPane().add(panel1, BorderLayout.NORTH); 
     getContentPane().add(cardPanelA, BorderLayout.NORTH); 
     getContentPane().add(cardPanelB, BorderLayout.NORTH); 
     */ 
    } 

    private class theHandler implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 

      if (event.getSource() == button) { 
       cl.show(cardPanel, "Panel A"); 
      } 
      if (event.getSource() == change) { 
       cl.show(cardPanelB, "panelB"); 
      } 
      if (event.getSource() == button2) { 
       cl.show(cardPanel, "PanelA"); 
      } 
      if (event.getSource() == button1) { 
       JOptionPane.showMessageDialog(null, "this is the second screen"); 
      } 

     } 
    } 

} 

/* способ использования CardLayout: создать менеджер CardLayout и создать кучу разных JPanel, которые * бы каждому из них будет другой экран. Создайте панель, в которой MapLayout хранится как макет. * Добавить различные элементы в каждой панели (кнопки, текстовые поля), а затем добавить к панели JPanel, который хранит * CardLayout */

import javax.swing.JFrame; 

public class CardTest { 
    public static void main(String[] args) { 

     CL object = new CL(); 
     object.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     object.setSize(400, 400); 
     object.setVisible(true); 

    } 
} 

Это может быть что-то простое, но я не уверен, что это. Некоторые советы будут оценены.

+0

Это может быть глупым предложением, но убедитесь, что вы бежите весь код GUI через диспетчеризацию событий нить. Раньше у меня были проблемы с моим старым, медленным нетбуком, когда я этого не делал, и я считаю, что одним из симптомов было то, что все черное, хотя я плохо помню. – Kon

ответ

0

Убедитесь, что вы добавить свои панели к каркасу

add(cardPanel); 

Без этого не компоненты будут показаны

+0

спасибо, я знал, что это легко. Что-то, что я забыл сделать, это добавить имя к различным панелям. Например, в приведенном выше коде у меня есть cardPanel.add (cardPanelA); Мне нужно иметь cardPanel.add (cardPanelA, имя строки); Есть ли другой способ вызвать конкретное окно при вызове обработчика события, чтобы узнать, в каком окне я говорю. Например, я использую cl.show (cardPanelA, «PanelA»), могу ли я заменить «PanelA» чем-то другим вместо того, чтобы давать имена каждой панели? – polaris

Смежные вопросы