猿问

等待多个摇摆工人

等待多个摇摆工人

请考虑以下代码片段:

import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;import javax.swing.*;public class TestApplet extends JApplet{
    @Override
    public void init()
    {
        try
        {
            SwingUtilities.invokeAndWait(new Runnable()
            {
                @Override
                public void run()
                {
                    createGUI();
                }
            });
        }
        catch(InterruptedException | InvocationTargetException ex)
        {
        }
    }

    private void createGUI()
    {
        getContentPane().setLayout(new FlowLayout());
        JButton startButton = new JButton("Do work");
        startButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                JLabel label = new JLabel();
                new Worker(label).execute();
            }
        });
        getContentPane().add(startButton);
    }

    private class Worker extends SwingWorker<Void, Void>
    {
        JLabel label;

        public Worker(JLabel label)
        {
            this.label = label;
        }

        @Override
        protected Void doInBackground() throws Exception
        {
            // do work
            return null;
        }

        @Override
        protected void done()
        {
            getContentPane().remove(label);
            getContentPane().revalidate();
        }
    }}

下面是向applet添加一个标签,它显示工作线程的一些中间结果(使用发布/处理方法)。最后,标签从applet的窗格中移除。我的问题是,我如何创建多个标签,每个标签都有自己的工作线程,并在它们完成后删除它们?

提前谢谢。

最新情况:

我希望这能澄清我的问题。当所有的工人都完成了他们的任务,而不是在每个工人完成任务之后,我希望所有的标签立即被移除。



开满天机
浏览 379回答 2
2回答

白衣非少年

您所拥有的代码已经在一定程度上做到了这一点。单击按钮时,需要将标签实际添加到内容窗格中。就像这样:&nbsp;JLabel&nbsp;label&nbsp;=&nbsp;new&nbsp;JLabel(); &nbsp;getContentPane().add(label); &nbsp;getContentPane().validate(); &nbsp;new&nbsp;Worker(label).execute();在标签中添加一些文本可能是个好主意,这样当它被添加到屏幕上时,您就可以看到它了。&nbsp;JLabel&nbsp;label&nbsp;=&nbsp;new&nbsp;JLabel("Hello...I&nbsp;am&nbsp;here");最后,在doInBackplace()方法中,您可以在某些任务运行时添加一些代码来更新标签:&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;i&nbsp;<&nbsp;100;&nbsp;i++){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(20); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setText("Counting..."&nbsp;+&nbsp;i); &nbsp;&nbsp;}这样,您就可以实际看到任务正在运行。如果您多次单击该按钮,则会看到多个标签,每个标签都会在任务完成后消失。
随时随地看视频慕课网APP

相关分类

Java
我要回答