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

时间:2014-06-13 16:41:41

标签: 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.");
    }
}

我知道一个事实(并且感觉有点不好),我在setProgress()方法中调用更新(setMessage()doInBackground(),我有一个可疑的隐瞒我不应该。&lt;&lt;

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

之前我使用过jProgressBars,但不是以这种方式使用NetBeans。

1 个答案:

答案 0 :(得分:1)

您的问题恰恰与您在问题开头所说的相反。你说:

  

我有一种感觉,我在EDT上调用了我的jProgressBar更新(我知道这是错误的)。

恰恰相反。 JProgressBar的所有更新都应该在EDT上 on ,而你正好相反。您应该在SwingWorker的doInBackground(...)方法中不要在JProgressBar上调用任何方法。

而是考虑

  • 更改已收听的属性,例如您的SwingWorker的progress属性,并让JProgressBar在PropertyChangeListener中更新,以监听此属性的更改,或
  • 使用SwingWorker的发布/处理方法对允许您将数据从SwingWorker传输到EDT上的GUI。

我自己,我更喜欢在我的SwingWorker(在EDT上)添加一个PropertyChangeListener,并从这个监听器中更新我的JProgressBar。我认为它允许更好的代码分离,具有更低的耦合和更高的内聚力。