如何解决 Swing JPanel 中显示倒数计时器(JLabel)的延迟问题

发布于 2024-12-09 14:14:28 字数 3769 浏览 0 评论 0原文

我已经实现了一个倒计时器(在函数中),它每秒更新摆动面板中的标签,这是代码:

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.setText() 时没有立即更新 Jlabel

关于如何开始的任何建议游戏不会延迟显示 Jlabel
谢谢

I've implemented a count down timer(in function) which updates a label in swing panel every second this is the code:

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);
        }  

Now my problem is in another part of my code when I want to to the following things:

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;  

So The problem is when I want to start a game, I'm defining my timer and allocating it,
give it start command and going to the screen that I should see there the timer (JLabel updating).
And still although it should be already counting (even before that screen that shows the timer) I still got delay: I get the panel that show the timer, and after about two seconds the Jlabel appear and start to count down.
I think that it is because the event dispatch thread that is not updating immediately the Jlabel in the time I'm doing Jlabel.setText()

Any suggestions of how can I start a game without delay in showing the Jlabel?
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

飘逸的'云 2024-12-16 14:14:28

从线程中调用 SwingUtilities.invokeAndWait 来设置标签文本。

Call SwingUtilities.invokeAndWait frm the thread to set the label text.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文