当前位置: 首页 > 面试题库 >

使用SwingWorker在GUI中添加进度条

江正德
2023-03-14
问题内容

我使用SwingWorker使用Java Swing API制作进度条。

我有一个扩展SwingWorker的类

    class Swinger extends SwingWorker {
private ClassAnalyzer classAnalyzer;

public Swinger(ClassAnalyzer classAnalyzer){
     this.classAnalyzer = classAnalyzer;
}
        @Override
        public Void doInBackground() throws InterruptedException {

            try
        {     
            int progress = 0;
            while (progress < 100) {

 // at this point I make certain elaboration on classAnalyzer

                progress++;

                //Call the process method to update the GUI
                publish(progress);

            }                       
        }
        catch(InterruptedException e)
        {
        }
        return null;
    }

    @Override
    protected void process(List chunks) {
     for (Integer chunk : chunks) {
        progressBar.setValue(chunk);

        //if the switchtype checkbox is selected then
        //change the progressbar to a determined type
        //once the progress has reached 50
        if (chunk > 49)
        {
            if (switchType.isEnabled() && switchType.isSelected())
            {
                progressBar.setStringPainted(true);

            }

        }
     }
 }

}

第二节课(我正在写一篇)

 public Tester()
{
    JFrame guiFrame = new JFrame();

    //make sure the program exits when the frame closes
    guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    guiFrame.setTitle("Creating a Table Example");
    guiFrame.setSize(700,200);

    //This will center the JFrame in the middle of the screen
    guiFrame.setLocationRelativeTo(null);


    goButton = new JButton("Go");
    goButton.setActionCommand("Go");
    goButton.addActionListener(new ActionListener()
    {

        //When the button is clicked the SwingWorker class is executed and
        //the button is disabled
        @Override
        public void actionPerformed(ActionEvent event)
        {

            progressBar.setStringPainted(progressType.isSelected());
            ClassAnalyzer c = new ClassAnalyzer();
            Swinger task = new Swinger(c);
            task.execute();

            int methods = c.getNumberOfMethods();

            if(methods == 0){
            JOptionPane.showMessageDialogo(null, "methods not found");
            }

            goButton.setEnabled(false);
        }
    });

    }

当我在第二个测试器中启动时,在进度条出现之前会显示消息“找不到方法”,而在以后的情况下我希望出现该消息。该怎么办?


问题答案:

task.execute()将启动一个背景(从中doInBackground调用该方法),程序将继续执行。

task.execute() 不是阻塞方法,这是使用它的原因,因此您不要阻塞事件调度线程

您可以SwingWorker使用PropertyChangeListener

final ClassAnalyzer c = new ClassAnalyzer();
Swinger task = new Swinger(c);
task.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("state") && evt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
            int methods = c.getNumberOfMethods();

            if(methods == 0){
                JOptionPane.showMessageDialogo(null, "methods not found");
            }
        }
    }
});
task.execute();


 类似资料:
  • 我对Java没有太多的经验,并且很难得到一个进度条来工作。我正在使用NetBeans的内置GUI Maker。目前,我的程序从一个目录读取图像到一个图像数组。显然,这需要一点时间,因此我希望一个简单的进度条来更新用户,以了解加载的程度。我已经使用了其中一个拖放进度条组件。 我目前可以获取目录中的文件数,并可以计算加载文件的百分比 文件成功加载到数组中,但进度条只有在加载所有文件后才会更新。我尝试在

  • 问题内容: 我对SwingWorker和Java GUI有疑问。 我有几类,其处理的信息,我们可以给他们打电话,和。此处理可能需要很长时间。 这些都是的子类,但是本身并不是直接调用的(这些类使用继承自的方法。为了使EDT自由绘制进度条,在保持对象层次结构时最好的使用方法是什么?是否具有包装器类,并且有其调用?即使不扩展,它仍然可以按我期望的那样工作吗? 编辑:澄清我的问题,即使他们已经是子类,我如

  • 问题内容: 我一直在尝试了解如何添加进度条,我可以在正在实现的GUI中创建一个进度条,并使其显示出来,即使在通过http://docs.oracle.com/javase/tutorial/uiswing/components检查之后/progress.html对于如何将方法设置为任务,以便可以创建用于运行方法的进度栏,我仍然不清楚。请有人可以尝试向我解释这一点,还是可以发布一个示例,该示例在GU

  • 问题内容: 我是Java的新手,我看了一些有关SwingWorker的教程。但是,我不确定如何使用在上一个问题中给出的示例代码来实现它。 任何人都可以就我的代码片段解释如何使用SwingWorker和/或将我引向一个不错的教程吗?我已经看过了,但不确定自己是否了解。 问题答案: 通常,用于在中执行长时间运行的任务。 在事件调度线程(EDT)上运行长时间运行的任务可能会导致GUI锁定,因此要做的一件

  • 我试图为在GUI运行之前下载信息的应用程序编写一个进度条。因为下载和组织信息的过程非常漫长,所以我想通知用户进展情况。我决定在游戏后期使用进度条,因此,大部分代码都是编写的,我正在尝试将进度条合并到代码中,而无需对代码进行剧烈的重新操作。以下是进度条的代码。目前,一切运行完毕,GUI弹出后,进度条就会出现。 该程序最初调用GUI应用程序,然后运行数据库获取代码,如下所示。 swing worker

  • 问题内容: 当我尝试通过在Java的Jbutton中转到其属性然后添加图标来添加背景时,它会设置按钮的背景,但是我在按钮上编写的文本会向右移动(在按钮区域之外)。解决方案? 问题答案: 据我了解,您不是在设置背景,而是在此将Icon设置为button。这就是为什么您在右侧看到“图像”而在左侧看到文本的原因。要将图像作为背景添加到按钮,您需要覆盖方法并在其中绘制图像。