【发布时间】:2018-08-06 04:02:01
【问题描述】:
我正在尝试为在 GUI 运行之前下载信息的应用程序编写进度条。因为这是一个下载和整理信息的漫长过程,所以我想通知用户进度。我决定在游戏后期使用进度条,因此,大部分代码都是编写的,我试图将进度条合并到代码中,而不需要对代码进行大刀阔斧的改造。以下是进度条的代码。目前,进度条会在所有内容运行并弹出 GUI 后出现。
static class PopulatingCardsWorker extends SwingWorker<Void, Integer> {
JProgressBar jpb;
int max;
JLabel label;
public PopulatingCardsWorker(JProgressBar jpb, int maximum, JLabel label) {
this.jpb = jpb;
this.max = maximum;
this.label = label;
}
@Override
protected void process(List<Integer> chunks) {
int i = chunks.get(chunks.size()-1);
jpb.setValue(i); // The last value in this array is all we care about.
System.out.println(i);
label.setText("Loading " + i + " of " + max);
}
@Override
protected Void doInBackground() throws Exception {
for(int i = 0; i < max; i++) {
Thread.sleep(10); // Illustrating long-running code.
publish(i);
}
return null;
}
@Override
protected void done() {
try {
get();
JOptionPane.showMessageDialog(jpb.getParent(), "Success", "Success", JOptionPane.INFORMATION_MESSAGE);
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
}
private static void go(int max) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel label = new JLabel("Loading...");
JProgressBar jpb = new JProgressBar();
jpb.setIndeterminate(false);
jpb.setMaximum(max);
panel.add(label);
panel.add(jpb);
frame.add(panel);
frame.pack();
frame.setSize(200,90);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
new PopulatingCardsWorker(jpb, max, label).execute();
}
程序最初调用GUI应用程序,然后运行数据库获取代码,如下所示。
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MagicTheGatheringUI().setVisible(true);
}
});
}
public MagicTheGatheringUI() {
int i, size;
colorRefinementFilter = "selected";
try {
my_list=new CardDatabase();
my_list.sortByName(my_list.all_cards);
my_list.populateSubArrays();
size = my_list.all_cards.size();
for(i = 0; i < size; i++)
{
namesList.addElement(my_list.all_cards.get(i).name);
}
} catch(Exception e) {
System.out.println(e);
System.exit(0);
}
initComponents();
}
swing worker 是在“my_list=new CardDatabase();”的创建过程中创建的。在那个班上,我有摇摆工人和摇摆工人应该监控的过程。
我目前在名为“populate_cards()”的方法中调用 swing worker,并使用以下代码创建 swing worker。 swing worker 应该监控 populate_cards() 方法中发生的事情。 swing worker 方法中的所有数据都只是暂时的,直到我更好地了解如何让它按照我想要的方式工作。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
go(1000);
}
});
我认为问题在于我在实际 GUI 的“invokeLater”方法中调用进度条。
我查看了以下问题以尝试解决我的问题。
Can a progress bar be used in a class outside main?
我也看过教程。
【问题讨论】:
-
根据你的代码,我看不到你打电话的任何地方
PopulatingCardsWorker.go -
我还要强调
SwingWorker支持progress属性,该属性可以与PropertyChangeListener- demonstrated here 结合使用 -
我很抱歉。我重读了这篇文章并进行了更多编辑以提供更多代码。目前,代码有几千行,所以我试图将显示的内容限制为仅显示相关信息。再次,对于忽略您要求的最后一部分,我深表歉意。
-
populate_cards怎么称呼?您可以考虑提供一个runnable example 来演示工作流程和您当前的问题 -
Ummmm 我不确定提供一个可运行的例子对于这个程序来说有多可行。它相当大,需要花费大量时间将代码简化为详细说明我的问题的基本内容。要回答您的问题,populate_cards 是 CardDatabase 中的一种方法。因此,调用 GUI,然后在初始化组件之前,初始化数据库。初始化数据库时,会调用一个swing worker来监控正在初始化的数据库的进度。
标签: java user-interface progress-bar