gpt4 book ai didi

java - 使用 Java 的 GUI 应用程序的进度条

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:13 27 4
gpt4 key购买 nike

我正在尝试为在 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 工作线程是在创建“my_list=new CardDatabase();”期间创建的。在该类(class)中,我有 Swing worker 和 Swing worker 应该监控的流程。

我目前在名为“populate_cards()”的方法中调用 Swing Worker,并使用以下代码来创建 Swing Worker。 Swing Worker 应该监视 populate_cards() 方法中发生的情况。 Swing Worker 方法中的所有数据都只是临时的,直到我更好地了解如何使其按照我想要的方式工作。

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
go(1000);
}
});

我认为问题在于我在实际 GUI 的“invokeLater”方法内部调用进度条。

我查看了以下问题来尝试解决我的问题。

How to add a progress bar?

Can a progress bar be used in a class outside main?

我也看过教程。

最佳答案

你的代码没问题。代码结束后进度条(以及 gui 本身)弹出的原因是,默认情况下,在 java 中,代码和 gui 运行在同一个线程上。因为代码的优先级高于 gui,所以所有代码都会先执行,然后 gui 更新。

您应该在“go”方法中执行此操作:

new Thread(){
public void run(){
new PopulatingCardsWorker(jpb, max, label).execute();
}
} start();

see that article for more information about threads

我是通过手机接听的,对于写得不好很抱歉。

Code and GUi threads

and from Wikipedia

last one

关于java - 使用 Java 的 GUI 应用程序的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51700407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com