Java CardLayout:如何使事件仅在显示特定卡片时启动?
我正在使用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
//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
}
}