我知道该主题已经在许多问题上得到了解答,但仍然无法解决。
我只想 在提取 大型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插入/更新不会触发对流的过去数据的任何重新处理。