как отобразить другой экран

Я пишу простую программу, используя 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, * каждая из которых будет отдельным экраном. Создайте панель, которая хранит CardLayout в качестве макета. * Добавьте различные элементы в каждую панель (кнопки, текстовые поля), а затем добавьте панели в 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);

    }
}

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


person polaris    schedule 08.08.2013    source источник
comment
Это может быть глупым предложением, но убедитесь, что вы запускаете весь свой код GUI через поток диспетчеризации событий. Раньше у меня были проблемы с моим старым медленным нетбуком, когда у меня их не было, и я полагаю, что одним из симптомов было то, что все отображалось черным, хотя я плохо помню.   -  person Kon    schedule 08.08.2013


Ответы (1)


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

    add(cardPanel);

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

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