【问题标题】:Redraw GUI Prior Thread.Sleep重绘 GUI Prior Thread.Sleep
【发布时间】:2016-10-29 19:54:35
【问题描述】:

我认为这对我来说会简单得多,但我错过了这个概念。简而言之,我制作了一种淡出音频的方法,并使用 Thread.Sleep 让它在 for 循环中“等待”。在调用该方法之前,我将几个标签和文本字段设置为不可见,但它们要等到线程休眠后才会更改。我试图将标签包装在一个 do-while 循环中以强制它们,甚至尝试在它之后调用重绘,但它没有解决任何问题。任何建议将不胜感激:

已编辑以包含 ActionPerformed:

            public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == quit)
        {
            System.exit(0);
        }
        else if(e.getSource() == play)
        {
            System.out.println("PLAY");
            quit.setVisible(false);
            quit.setEnabled(false);
            play.setVisible(false);
            play.setEnabled(false);
            GameActivated();
        }
        else if(e.getSource() == submitTeams)
        {
            teamOneName = teamOneTF.getText();
            teamTwoName = teamTwoTF.getText();

            Swinpublic void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == quit)
        {
            System.exit(0);
        }
        else if(e.getSource() == play)
        {
            System.out.println("PLAY");
            quit.setVisible(false);
            quit.setEnabled(false);
            play.setVisible(false);
            play.setEnabled(false);
            GameActivated();
        }
        else if(e.getSource() == submitTeams)
        {
            teamOneName = teamOneTF.getText();
            teamTwoName = teamTwoTF.getText();

            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                               teamOneLabel.setVisible(false);
                               teamOneTF.setVisible(false);
                               teamTwoLabel.setVisible(false);
                               teamTwoTF.setVisible(false);
                               submitTeams.setVisible(false);
                }
                });

        }
        else
            System.out.println("Error: Button pressed with no known source.");
    }

下面是被调用的 AudioHandler1 的内部:

            for(int count = 0; count < 71; count++)
        {
            gainControl.setValue((float) count*-1);
            System.out.println("Waiting!" + Math.random());
            try 
                {
                Thread.sleep(50);
                } 
            catch(InterruptedException ex) 
                {
                    Thread.currentThread().interrupt();
                }

        }

【问题讨论】:

    标签: java eclipse windows multithreading thread-sleep


    【解决方案1】:

    您在这里阻止了 EDT。使用SwingWorker 调用AudioHandler1

            new SwingWorker<Void,Void>()
            {
            @Override
            protected Void doInBackground() throws Exception 
                {
                AudioHandler1("Theme.wav",false,true);
                return null;
                }
            }.execute();
    

    【讨论】:

    • 我尝试将 Override SwingWorker 放在 ActionEvent 中,就在 SwingUtilities 将标签设置为 false 的位置下方,但我遇到了一个错误。可以举个例子吗?
    • 如果你想看看我输入的内容,我也可以在顶部编辑我的帖子。
    • 在顶部添加了我的代码。它说它在 void 之前需要一个 @ 符号,但我不能将它移到类中,因为这会违反覆盖。请指教
    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2017-10-08
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多