【问题标题】:What is preventing my progress bar from updating?是什么阻止我的进度条更新?
【发布时间】:2013-07-31 16:26:18
【问题描述】:

我正在编写一个小函数,它将根据加权随机整数更新我的 ProgressBar 和 JLabel。线程正在正确休眠并且随机值正在通过,但是,我的进度条和 jlabel 没有更新。

这也让我的 GUI 没有响应。它没有完全锁定我的 GUI(我可以点击按钮,但它不执行与这些按钮相关的功能)。

在 run() 方法中抛出 print 语句不会被打印出来。所以我认为它永远不会进入那里。

到目前为止,这是我的方法:

private void updateProgressBar(int max) {
    final int maxDiamonds = max;
    int i = 0;
    while(i <= max) {
        //get random obstacle found
        final Obstacle o = obstacle.next();
        System.out.println("Obstacle: " + o.getName());
        //get random number of diamonds for obstacle
        int numDiamonds = Integer.parseInt(numFoundDiamonds.next());
        System.out.println("Number of Diamonds: " + numDiamonds);
        //set currentValue for the progress bar
        final int currentValue = i;

        for(int j = o.getRemovalTime(); j >= 0; j--) {
            final int rSecs = j;
            System.out.println("Time remaining to remove: " + rSecs);
            try {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        progressBar.setString(currentValue + "/" + maxDiamonds);
                        statusLabel.setText("Found " + o.getName() + ". Removing: " + rSecs + " s Remaining.");
                    }
                });
                java.lang.Thread.sleep(1000);
            } catch (InterruptedException e) {
                JOptionPane.showMessageDialog(this, e.getMessage());
            }
        }
        i += numDiamonds;  
    }

}

也许我忽略了一些简单的事情。

我还可以提供更多关于使用的其他类的代码,但我觉得问题在于提供的代码。

【问题讨论】:

    标签: java user-interface progress-bar swingutilities


    【解决方案1】:

    您在 Swing 事件线程上调用 Thread.sleep(...),这将使整个 Swing 线程和应用程序进入睡眠状态。使用后台线程,例如 SwingWorker。

    【讨论】:

    • 这会导致线程在更新进度条和jlabel之前休眠?
    • @WilliamShatner:是的。 Swing 事件线程在 Swing 事件队列有时间处理已放置在其上的事件之前处于休眠状态。同样,使用 SwingWorker。这就是它的用途。
    • 我想知道为什么这么多教程以与我上述方法相似的方式显示它。我想我会回到你最初向我展示的方式! stackoverflow.com/questions/10236995/…
    • @WilliamShatner:没错。 SwingWorker 具有 PropertyChangeListener 可以侦听的进度状态。例如请检查this answer。
    • 气垫船,困扰我的是,每当我想正确使用 JProgressBar 时,我似乎都必须编写一个自定义类。如果这是真的,为什么 JProgressBar 不默认扩展 SwingWorker?
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多