为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕盖茨4494581 2021-06-18 22:59:44
我正在尝试为在 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();}在“my_list=new CardDatabase();”的创建过程中创建了swing worker。在那个班级里,我有摇摆工人和摇摆工人应该监控的过程。我目前在名为“populate_cards()”的方法中调用 swing worker,并使用以下代码创建了 swing worker。摇摆工人应该监控 populate_cards() 方法中发生的事情。Swing Worker 方法中的所有数据都只是暂时的,直到我更好地了解如何让它按照我想要的方式工作。
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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


你应该在“go”方法中做到这一点:


new Thread(){

    public void run(){

       new PopulatingCardsWorker(jpb, max, label).execute();

    }

} start();


查看完整回答
反对 回复 2021-06-30
  • 1 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信