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

处理时更新JProgressBar

诸葛康胜
2023-03-14
问题内容

我知道该主题已经在许多问题上得到了解答,但仍然无法解决。

我只想 在提取 大型xml文件的 某些内容更新progressBar
。我认为在另一个线程中使用耗时的循环就足够了,但是?。我设法得到的是ProgressBar要么根本不显示,要么在关闭之前最后进行更新。

在启动该应用程序附近的某个地方,我有:

public class SomeClass {
    private SomeClass () {
        myXMLParser reader = new myXMLParser();
        CoolStuff fromXml = reader.readTheXml();
    }
}

在显示和更新带有JProgressBar的JDialog时:

public class LoadingDialog extends JDialog {
    private JProgressBar progressBar;
    /* ... */
    public void progress() {
        progressBar.setValue(progressBar.getValue() + 1);
    }
}

所以我有这个 myXMLParser

public class myXMLParser {
    private LoadingDialog loadingDialog = new LoadingDialog();

    public CoolStuff readTheXml() {
        CoolStuff fromXml = new CoolStuff();
        while(manyIterations) {
            loadingDialog.progress();
            fromXml.add(some() + xml() + reading());
        }
        return fromXml;
    }
}

我见过很多事情SwingWorker,并使用PropertyChange事件更新进度,但实例始终给予 所有功能于一身
,具有处理和同一个类中的进度,并与班内班,因为我在Java中开始,我没无法将其转化为我的情况。

有帮助吗?。(不是很明显)任何建议吗?

编辑: 因此,感谢btantlinger,它像这样工作:

public class SomeClass {
    private SomeClass () {
        myXMLParser reader = new myXMLParser();
        new Thread(new Runnable() {
            @Override
            public void run() {
                CoolStuff fromXml = reader.readTheXml();
            }
        }).start();
    }
}

public class LoadingDialog extends JDialog {
    private JProgressBar progressBar;
    /* ... */
    public void progress() {
        progressBar.setValue(progressBar.getValue() + 1);
    }
}

public class myXMLParser {
    private LoadingDialog loadingDialog = new LoadingDialog();

    public CoolStuff readTheXml() {
        CoolStuff fromXml = new CoolStuff();
        while(manyIterations) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    loadingDialog.progress();
                }
            });
            fromXml.add(some() + xml() + reading());
        }
        return fromXml;
    }
}

问题答案:

您必须更新Swing事件调度线程上的JProgress栏。您不能在任何其他线程上修改Swing组件。

您唯一的其他选择是在启动线程之前,将JProgress栏设置为“不确定”,以使进度栏来回移动。

例如

progBar.setIndeterminate(true);

请参阅SwingWorker
Javadoc:http
:
//docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

如果您不想使用SwingWorker,则另一个SwingUtilities.invokeLater方法是

//inside your long running thread when you want to update a Swing component
SwingUtilities.invokeLater(new Runnable() {
    public void run() {

        //This will be called on the EDT
        progressBar.setValue(progressBar.getValue() + 1);


    }
});


 类似资料:
  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside

  • 问题内容: 我有一个dao,它基本上使用hibernate将记录插入到一​​个表中,该dao用标记为注释,并且我有一个服务,该服务会生成其他一些东西,然后调用我的dao。我的服务也标注了使用。 我叫服务循环。我在dao上的插入内容是否可以批量或一个接一个地工作?我如何确定它们可以批量工作?hibernateTransaction Manager是否管理批处理插入? 我正在使用Oracle DB。

  • 问题内容: 对于Java-JDBC API和Oracle数据库,我有一个稍微独特的要求。我将autoCommit设置为默认值,这对于Oracle是正确的,并且我使用的示例与此链接相似。 但是,当我添加说1000批次时,可以说每个批次都是插入的。并且让我们假设大约20条记录违反了某些约束,我希望其余980条变为COMMITTED(并且以后对使用任何其他连接的任何其他查询都可见)到数据库,并忽略20条

  • 我想更新/删除OWL类中的公理(例如SubclassOf axioms)。 我有以下两种方法: 1)删除所有旧公理,然后创建所有新公理。 我想用-

  • 问题内容: 当前,我们在数据层中使用JDBC,并计划用hibernate代替它。我是Hibernate的新手,不确定Hibernate如何处理并发。如果我们使用spring进行事务管理,有人可以解释一下我如何处理并发更新:通过hibernate(在内存中进行hibernate的自动版本管理),或者我必须将version列放入数据库中以手动处理并发更新。 问题答案: 无论你是否使用Spring进行事

  • 这里是一个假设但类似的场景,与我试图使用Kafka流实现的场景相似。 我有流数据,销售,我想丰富不经常变化的查找数据,例如用户和项目,我计划为它创建KTable。我计划使用connect Sink将这些丰富的数据推送到一个主题和搜索引擎。 我如何确保用户/项目数据的更新也会触发过去销售数据的丰富,而不仅仅是在流中摄入的新数据。据我所知,KTable插入/更新不会触发对流的过去数据的任何重新处理。