Java CardLayout:如何使事件仅在显示特定卡片时启动?

Java CardLayout:如何使事件仅在显示特定卡片时启动?,java,swing,timer,cardlayout,Java,Swing,Timer,Cardlayout,我正在使用CardLayout显示一系列问题。对于每个问题,标签上都会显示一个计时器。我通过了主课的问题和每个问题的时间限制 //Reference - SynforgeTutorials public class Quiz extends JFrame{ JPanel p=new JPanel(); CardLayout cards=new CardLayout(); int numQs; int cardnumber; CL1 questions

我正在使用CardLayout显示一系列问题。对于每个问题,标签上都会显示一个计时器。我通过了主课的问题和每个问题的时间限制

//Reference - SynforgeTutorials
public class Quiz extends JFrame{
    JPanel p=new JPanel();
    CardLayout cards=new CardLayout();
    int numQs;


    int cardnumber;

    CL1 questions[];



    public static void main(String[] args) {

        String[] messages = {"What is area of a circle?","When does spring start?","When is the next leap year?","How many days in a week?","What causes seasons?"};
        int[] mins = {1,2,0,1,1};
        int[] secs = {30,0,30,0,0};
        new Quiz(messages,mins,secs);
    } 

    public Quiz(String messages[],int mins[],int secs[]){


        questions = new CL1[messages.length];

        for(int i=0;i<questions.length;i++)
        {
        questions[i] = new CL1(messages[i],mins[i],secs[i],this);

        }

        p.setLayout(cards);

        numQs=questions.length;
        for(int i=0;i<numQs;i++){
            p.add(questions[i],"q"+i);
        }

        cardnumber = 0;

        cards.show(p,"q"+ cardnumber);


        add(p);
        setVisible(true);


    }

    public void OK(){
        if(cardnumber==(numQs-1)){

            this.dispose();

        }
        else{

            cardnumber = cardnumber + 1;
            cards.show(p,"q"+ cardnumber);
        }
    }

}
//参考-语法教程
公共类测验扩展了JFrame{
JPanel p=新的JPanel();
CardLayout卡=新的CardLayout();
int numQs;
int卡号;
CL1问题[];
公共静态void main(字符串[]args){
String[]messages={“什么是圆的面积?”,“春天什么时候开始?”,“下一个闰年是什么时候?”,“一周有多少天?”,“什么导致季节?”;
int[]分钟={1,2,0,1,1};
int[]secs={30,0,30,0,0};
新测验(信息、分钟、秒);
} 
公开测验(字符串消息[],整数分钟[],整数秒[]){
问题=新的CL1[messages.length];
对于(int i=0;i
我希望每个卡的计时器仅在显示该卡时启动

您可以使用
HierarchyListener
侦听每个卡的可见性的更改:

@Override
public void hierarchyChanged(HierarchyEvent e)
{
    JComponent component = (JComponent)e.getSource();

    if ((HierarchyEvent.SHOWING_CHANGED & e.getChangeFlags()) != 0
    &&  component.isShowing())
    {
        // start the Timer
    }
}
因此,您需要将
HierarchyListener
添加到添加到
CardLayout
的每个面板中

我想让这张卡自动换到下一张卡


卡片布局
支持“下一张卡片”功能,因此当计时器达到0时,您只需调用相应的方法。

非常感谢您的帮助。我能够为每张卡分别启动计时器。关于第二部分,当计时器达到0时,我如何更改到下一张卡?这些卡将从容器类更改,其中计时器位于调用类中的一个面板。@sanaku,请阅读
CardLayout
API。它支持“下一个”卡功能,因此您只需调用
next(…)
方法。
@Override
public void hierarchyChanged(HierarchyEvent e)
{
    JComponent component = (JComponent)e.getSource();

    if ((HierarchyEvent.SHOWING_CHANGED & e.getChangeFlags()) != 0
    &&  component.isShowing())
    {
        // start the Timer
    }
}