как да покажа различен екран

Пиша проста програма, използвайки 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 мениджър и създайте куп различни JPanels, всеки от които ще бъде различен екран. Направете панел, който съхранява 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