睡觉java线程但首先更新jFrame

时间:2015-02-09 19:24:33

标签: java multithreading swing

我想在执行mediaPlayer()函数之前显示文本。在执行媒体播放器期间,我睡觉了。那没关系,因为之后不需要发生任何事情(然后只需要倾听)。

然而,最后一个文字:"收听...",没有显示(除了延迟几秒)。有没有办法在线程进入睡眠状态之前先刷新jFrame?

 expText.setText("Listen to the song and give a rating when it finishes.");

                    startButton.setEnabled(false);


                    //play sound
                    try {
                        mediaPlayer();
                        //wait for the duration of the stimuli
                        Thread.sleep(stimDuration);
                    ...

2 个答案:

答案 0 :(得分:2)

setText不会显示,直到EDT渲染另一帧,因为它在stimDuration的时间内忙着睡觉,所以不能这样做。

尝试在单独的线程上播放声音,在其他线程上播放声音,检测声音何时停止,然后在EDT上执行另一个操作,将expText更改回原始文本了。

答案 1 :(得分:1)

下面结合使用Threads和Swing Timer解决了这个问题。

            Thread t2 = new Thread(new Runnable() {
                        public void run() {
                            try {
                                startButton.setEnabled(false);
                                startButton.setVisible(false);
                                buttonsPanel.setEnabled(false);
                                buttonsPanel.setVisible(false);
                                expText.setText("Listen to the song and give a rating when it finishes.");
                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        }
                    });
                    t2.start();




                    Thread t1 = new Thread(new Runnable() {
                        public void run() {
                            // code goes here.
                            try {
                                mediaPlayer();
//                               Thread.sleep(5000);


                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        }
                    });
                    t1.start();

                    ActionListener taskPerformer = new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                            //...Perform a task...

                            resultButtonGroup.clearSelection();
                            startButton.setEnabled(true);
                            startButton.setVisible(true);
                            buttonsPanel.setVisible(true);

                        }
                    };
                    Timer timer = new Timer(stimDuration ,taskPerformer);
                    timer.setRepeats(false);
                    timer.start();