Как мога да разреша забавянето при показване на таймер за обратно броене (JLabel) в Swing JPanel

Внедрих таймер за обратно броене (във функция), който актуализира етикет в люлеещ се панел всяка секунда, това е кодът:

public void DefineTimer()
    {
    Action updateClockAction = new AbstractAction() {
                    public void actionPerformed(ActionEvent e){

                         JPanelMainGame.this.jLabelSeconds.setText(Integer.toString(JPanelMainGame.this.m_TimerTotalSeconds));
                         JPanelMainGame.this.jLabelSeconds.setFont(new java.awt.Font("Lucida Handwriting", 1, 36));
                         JPanelMainGame.this.jLabelSeconds.setForeground(Color.red);
                         JPanelMainGame.this.jLabelSeconds.setVisible(true);



                        if( JPanelMainGame.this.m_TimerTotalSeconds >0)
                        {
                             JPanelMainGame.this.m_TimerTotalSeconds--;
                        }
                        else if ( JPanelMainGame.this.m_TimerTotalSeconds == 0)
                        {

                            JPanelMainGame.this.m_Timer.stop();
                            JPanelMainGame.this.jLabelSeconds.setText("0");
                            System.out.println("!m_WasGameDecisived: "+!m_WasGameDecisived);

                            JPanelGameApplet gameApplet = (JPanelGameApplet) getTopLevelAncestor();
                            //Checking whether time ended for both players and no solution was recieved

                            if(gameApplet.GetJPanelChooseGame().GetGameType() == eGameType.Net)
                            {


                                gameApplet.GetClinetThread().UpdateServerOfTimeEnded();

                                if (!m_WasGameDecisived)
                                {
                                    // 
                                    System.out.println("Tie - No one had a solution in the given time");

                                    System.out.println("Before send request to solve - Is Socket Closed:"+((JPanelGameApplet) 
                                    gameApplet.GetClinetThread().SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer();

                                    ((JPanelGameApplet)getTopLevelAncestor()).GetDJ().stop();
                                    Menu.BrowseTo(PanelMenuNumber.k_ChooseGame, JPanelMainGame.this.getParent());
                                    ((JPanelGameApplet)getTopLevelAncestor()).GetDJ().play(0);

                                }
                            }
                            else if(gameApplet.GetJPanelChooseGame().GetGameType() == eGameType.Single)
                            {
                                JPanelMainGame.this.showPopUpSelectionBar();

                            }

                        }

                       ((JPanelGameApplet)getTopLevelAncestor()).GetNetMainGame().Initialize();

                    }
                };
                m_Timer = new Timer(1000, updateClockAction);
        }  

Сега проблемът ми е в друга част от моя код, когато искам да направя следните неща:

case ProtocolMessages.k_StartGame:
                       m_GameApplet.GetJpanelStartNetGame().DefineTimer();
                       m_GameApplet.GetJpanelStartNetGame().GetTimer().start();
                       m_GameApplet.ShowBoardToSolve();
                       Menu.BrowseTo(PanelMenuNumber.k_NetPlayersGameStart,m_GameApplet.GetJPanelNetGameSetting().getParent());
                       m_GameApplet.GetDJ().Next();
                       break;  

Така че проблемът е, когато искам да стартирам игра, дефинирам своя таймер и го разпределям, давам му команда за стартиране и отивам на екрана, където трябва да видя таймера (JLabel актуализиране).
И въпреки това, трябва вече да брои (дори преди този екран, който показва таймера) Все още имам забавяне: получавам панела, който показва таймера, и след около две секунди се появява Jlabel и започва да отброява.
Мисля, че е тъй като нишката за изпращане на събитието, която не актуализира незабавно Jlabel по времето, когато правя Jlabel.setText()

Някакви предложения за това как мога да започна игра без забавяне в показването на Jlabel?
Благодаря


person JavaSa    schedule 12.10.2011    source източник
comment
За по-добра помощ по-рано, публикувайте SSCCE.   -  person Andrew Thompson    schedule 12.10.2011
comment
@AndrewThompson: Наистина ще се радвам да чуя някои съвети от вас тук, мисля, че моят код е наистина лесен за разбиране в неговата собствена версия :)   -  person JavaSa    schedule 12.10.2011
comment
Мисля.. Няма обяснение за това какво мислят хората. Ще разгледам внимателно кода само след като е компилиран в моя редактор и съм го виждал да работи (или да не работи) на екрана.   -  person Andrew Thompson    schedule 12.10.2011
comment
Използвайте SwingWorker, вижте този отговор: stackoverflow.com/questions/6889121/   -  person brcosta    schedule 14.10.2011


Отговори (1)


Извикайте SwingUtilities.invokeAndWait от нишката, за да зададете текста на етикета.

person StanislavL    schedule 12.10.2011
comment
Не мога - вече съм в нишката за изпращане на събитие и следователно се хвърля изключение, че не мога да го направя, тъй като вече съм в нишката за изпращане на събитие - person JavaSa; 12.10.2011