java - NetBeans - 需要帮助从自动生成的代码更新 jProgressBar

标签 java netbeans netbeans-6.9 jprogressbar

(忽略下面的句子 - 我很愚蠢)。我有一种感觉,我正在 EDT 上调用 jProgressBar 的更新(我知道这是错误的)。

@Action
public Task launchScenario() {

    return new LaunchScenarioTask(getApplication());
}

private class LaunchScenarioTask extends org.jdesktop.application.Task<Object, Void> {

    LaunchScenarioTask(org.jdesktop.application.Application app) {
        super(app);
        launchTestCaseButton.setEnabled(false);
        progressBar.setIndeterminate(false);
        statusPanel.validate();
        statusPanel.repaint();
        totalTests = scenarioRepeat * selectedSSIDS.length;
        setProgress(0);
    }

    @Override
    protected Object doInBackground() {
        currentScenario = 1;

        progressBar.setMaximum(totalTests);
        progressBar.setMinimum(0);

        try {
            Thread.sleep((long) 500);
        } catch (InterruptedException ignore) {
        }

        int ssidsToTest = selectedSSIDS.length;

        //For every SSID, we iterate through and create an autoconnector object
        for (int counter = 0; counter < ssidsToTest; counter++) {

            try {
                setMessage("Preparing " + selectedSSIDS[counter] + " test case...");
                Thread.sleep((long) 2000);
            } catch (InterruptedException ignore) {
            }

            setMessage("Launching ");
            AutoConnector ac = new AutoConnector(selectedSSIDS[counter]);

            for (int i = 0; i < scenarioRepeat; i++) {
                if (ac.connected()) {
                    setMessage("Running test " + currentScenario + "/" + totalTests);
                    currentScenario++;
                    passedTests++;
                } else {
                    currentScenario++;
                    failedTests++;
                }

                System.out.println("setting progress");
                setProgress((currentScenario / totalTests) * 100);
                progressBar.setString((currentScenario / totalTests) * 100 + "% complete");
            }

        }
        try {
            Thread.sleep((long) 500);
        } catch (InterruptedException ignore) {
        }
        return null;  // return your result
    }

    @Override
    protected void succeeded(Object result) {
        launchTestCaseButton.setEnabled(true);
        setMessage("Complete. " + passedTests + " tests passed and "
                + failedTests + " tests failed.");
    }
}

我确实知道(并且感觉有点糟糕),我正在 doInBackground() 方法中调用更新(setProgress()setMessage()),但我隐隐怀疑我不应该这样做。<<

所以问题是,我应该将 setProgress() 片段放在代码中的哪里?这是否需要我使用 AutoConnector 类创建一个任务并查看是否可以从那里更新 jProgressBar?

我以前使用过 jProgressBars,但没有以这种方式使用 NetBeans。

最佳答案

您的问题与您在问题开头所说的正好相反。您声明:

I have a feeling that I am calling the updates to my jProgressBar on the EDT (which I know is wrong).

事实恰恰相反。对 JProgressBar 的所有更新都应在 EDT 上进行,而您所做的恰恰相反。您不应从 SwingWorker 的 doInBackground(...) 方法中调用 JProgressBar 上的任何方法。

而是考虑

  • 更改监听的属性(例如 SwingWorker 的进度属性),并在监听此属性更改的 PropertyChangeListener 中更新 JProgressBar,或者
  • 使用 SwingWorker 的发布/处理方法对,您可以将数据从 SwingWorker 传输到 EDT 上的 GUI。

我自己更喜欢将 PropertyChangeListener 添加到我的 SwingWorker(在 EDT 上),并从此监听器中更新我的 JProgressBar。我认为与第一个选项相比,它可以实现更好的代码分离,并且具有更低的耦合性和更高的内聚性。

关于java - NetBeans - 需要帮助从自动生成的代码更新 jProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24210134/

相关文章:

java - 使用匹配器断言 Collection 包含 2 个具有相同属性的对象

java - 这会在使用后释放我的资源吗?

java - 微服务资源管理

java - 使用 addActionListener() 的 ActionPerformed 和 Netbeans 生成的 ActionPerformed 之间有什么区别?

java - NetBeans 6.9.1 中 Java 帮助文件的 .hs 和 .jhm 的放置位置

java - 当连接在事务中关闭时会发生什么?

php - 在 NetBeans 中设置 Yii 2 Web 框架编码标准

java - 如何使 netbeans 中的自动完成既包括变量又包括方法?

ruby-on-rails - 适用于 Windows 上 Rails3 的工作 IDE

java - Swing GUI 中的图像-NetBeans