问题描述
问题:写了个example学习Swing:每次TimerEvent(oncepersec)发生时选择下一个RadioButton。但总是选择下下一个。平台:MacOSX,JDK1.6,Eclipse3.6调试:经过调试,发现每秒fire两个TimerEvent。代码:Timer相关内容用粗体字标识packagecomponents;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.Timer;publicclassRadioButtonDemoextendsJPanelimplementsActionListener{privatestaticfinallongserialVersionUID=1L;staticStringbirdString="Bird";staticStringcatString="Cat";staticStringdogString="Dog";staticStringrabbitString="Rabbit";staticStringpigString="Pig";JButtonautoButton;JRadioButtonbirdButton,catButton,dogButton,rabbitButton,pigButton;Timertimer=newTimer(1000,this);publicRadioButtonDemo(){super(newBorderLayout());//CreatetheAUTObutton.autoButton=newJButton("auto");autoButton.setActionCommand("auto");//Createtheradiobuttons.birdButton=newJRadioButton(birdString);birdButton.setMnemonic(KeyEvent.VK_B);birdButton.setActionCommand(birdString);birdButton.setSelected(true);catButton=newJRadioButton(catString);catButton.setMnemonic(KeyEvent.VK_C);catButton.setActionCommand(catString);dogButton=newJRadioButton(dogString);dogButton.setMnemonic(KeyEvent.VK_D);dogButton.setActionCommand(dogString);rabbitButton=newJRadioButton(rabbitString);rabbitButton.setMnemonic(KeyEvent.VK_R);rabbitButton.setActionCommand(rabbitString);pigButton=newJRadioButton(pigString);pigButton.setMnemonic(KeyEvent.VK_P);pigButton.setActionCommand(pigString);//Grouptheradiobuttons.ButtonGroupgroup=newButtonGroup();group.add(birdButton);group.add(catButton);group.add(dogButton);group.add(rabbitButton);group.add(pigButton);//Registeralistenerfortheradiobuttons.birdButton.addActionListener(this);catButton.addActionListener(this);dogButton.addActionListener(this);rabbitButton.addActionListener(this);pigButton.addActionListener(this);autoButton.addActionListener(this);//Puttheradiobuttonsinacolumninapanel.JPanelradioPanel=newJPanel(newGridLayout(0,1));radioPanel.add(birdButton);radioPanel.add(catButton);radioPanel.add(dogButton);radioPanel.add(rabbitButton);radioPanel.add(pigButton);add(radioPanel,BorderLayout.LINE_START);add(autoButton,BorderLayout.CENTER);setBorder(BorderFactory.createEmptyBorder(20,20,20,20));}/**Listenstotheradiobuttons.*/publicvoidactionPerformed(ActionEvente){if("timer".equals(e.getActionCommand())){if(birdButton.isSelected()){catButton.setSelected(true);}elseif(catButton.isSelected()){dogButton.setSelected(true);}elseif(dogButton.isSelected()){rabbitButton.setSelected(true);}elseif(rabbitButton.isSelected()){pigButton.setSelected(true);}elseif(pigButton.isSelected()){birdButton.setSelected(true);}}elseif("auto".equals(e.getActionCommand())){timer.addActionListener(this);timer.setActionCommand("timer");timer.setInitialDelay(1000);timer.start();}}/***CreatetheGUIandshowit.Forthreadsafety,*thismethodshouldbeinvokedfromthe*event-dispatchingthread.*/privatestaticvoidcreateAndShowGUI(){//Createandsetupthewindow.JFrameframe=newJFrame("RadioButtonDemo");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Createandsetupthecontentpane.JComponentnewContentPane=newRadioButtonDemo();newContentPane.setOpaque(true);//contentpanesmustbeopaqueframe.setContentPane(newContentPane);//Displaythewindow.frame.pack();frame.setVisible(true);}publicstaticvoidmain(String[]args){//Scheduleajobfortheevent-dispatchingthread://creatingandshowingthisapplication'sGUI.javax.swing.SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){createAndShowGUI();}});}}请给个思路fix这个问题。谢谢您的时间
解决方案
解决方案二:
大过年的,还在弄技术,可喜~
解决方案三:
忘记用Codetag了,抱歉
packagecomponents;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.Timer;publicclassRadioButtonDemoextendsJPanelimplementsActionListener{privatestaticfinallongserialVersionUID=1L;staticStringbirdString="Bird";staticStringcatString="Cat";staticStringdogString="Dog";staticStringrabbitString="Rabbit";staticStringpigString="Pig";JButtonautoButton;JRadioButtonbirdButton,catButton,dogButton,rabbitButton,pigButton;Timertimer=newTimer(1000,this);publicRadioButtonDemo(){super(newBorderLayout());//CreatetheAUTObutton.autoButton=newJButton("auto");autoButton.setActionCommand("auto");//Createtheradiobuttons.birdButton=newJRadioButton(birdString);birdButton.setMnemonic(KeyEvent.VK_B);birdButton.setActionCommand(birdString);birdButton.setSelected(true);catButton=newJRadioButton(catString);catButton.setMnemonic(KeyEvent.VK_C);catButton.setActionCommand(catString);dogButton=newJRadioButton(dogString);dogButton.setMnemonic(KeyEvent.VK_D);dogButton.setActionCommand(dogString);rabbitButton=newJRadioButton(rabbitString);rabbitButton.setMnemonic(KeyEvent.VK_R);rabbitButton.setActionCommand(rabbitString);pigButton=newJRadioButton(pigString);pigButton.setMnemonic(KeyEvent.VK_P);pigButton.setActionCommand(pigString);//Grouptheradiobuttons.ButtonGroupgroup=newButtonGroup();group.add(birdButton);group.add(catButton);group.add(dogButton);group.add(rabbitButton);group.add(pigButton);//Registeralistenerfortheradiobuttons.birdButton.addActionListener(this);catButton.addActionListener(this);dogButton.addActionListener(this);rabbitButton.addActionListener(this);pigButton.addActionListener(this);autoButton.addActionListener(this);//Puttheradiobuttonsinacolumninapanel.JPanelradioPanel=newJPanel(newGridLayout(0,1));radioPanel.add(birdButton);radioPanel.add(catButton);radioPanel.add(dogButton);radioPanel.add(rabbitButton);radioPanel.add(pigButton);add(radioPanel,BorderLayout.LINE_START);add(autoButton,BorderLayout.CENTER);setBorder(BorderFactory.createEmptyBorder(20,20,20,20));}/**Listenstotheradiobuttons.*/publicvoidactionPerformed(ActionEvente){if("timer".equals(e.getActionCommand())){if(birdButton.isSelected()){catButton.setSelected(true);}elseif(catButton.isSelected()){dogButton.setSelected(true);}elseif(dogButton.isSelected()){rabbitButton.setSelected(true);}elseif(rabbitButton.isSelected()){pigButton.setSelected(true);}elseif(pigButton.isSelected()){birdButton.setSelected(true);}}elseif("auto".equals(e.getActionCommand())){timer.addActionListener(this);timer.setActionCommand("timer");timer.setInitialDelay(1000);timer.start();}}/***CreatetheGUIandshowit.Forthreadsafety,*thismethodshouldbeinvokedfromthe*event-dispatchingthread.*/privatestaticvoidcreateAndShowGUI(){//Createandsetupthewindow.JFrameframe=newJFrame("RadioButtonDemo");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Createandsetupthecontentpane.JComponentnewContentPane=newRadioButtonDemo();newContentPane.setOpaque(true);//contentpanesmustbeopaqueframe.setContentPane(newContentPane);//Displaythewindow.frame.pack();frame.setVisible(true);}publicstaticvoidmain(String[]args){//Scheduleajobfortheevent-dispatchingthread://creatingandshowingthisapplication'sGUI.javax.swing.SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){createAndShowGUI();}});}}
解决方案四:
elseif("auto".equals(e.getActionCommand())){//timer.addActionListener(this);将这行去掉再试试。timer.setActionCommand("timer");timer.setInitialDelay(0);timer.start();}