簡體   English   中英

NetBeans-從自動生成的代碼更新jProgressBar時需要幫助

[英]NetBeans - Need assistance in updating jProgressBar from autogenerated code

(忽略下面的句子-我很笨)。 我有一種感覺,我正在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() doInBackground() ,並且我有一個偷偷摸摸的懷疑,我不應該這樣。

所以問題是,我應該在代碼中的哪里放置setProgress()代碼片段? 這會要求我使用AutoConnector類創建任務並查看是否可以從那里更新jProgressBar嗎?

我以前使用過jProgressBars,但在NetBeans中卻沒有使用過這種方式。

您的問題與問題開始時所說的相反。 您聲明:

我有一種感覺,我正在EDT上調用jProgressBar的更新(我知道這是錯誤的)。

恰恰相反。 在所有JProgressBar的更新應該美國東部時間進行,你正在做的正好相反。 您不應在SwingWorker的doInBackground(...)方法doInBackground(...) JProgressBar上調用任何方法。

而是考慮

  • 更改偵聽的屬性(例如SwingWorker的progress屬性),並在PropertyChangeListener中更新JProgressBar,以偵聽對此屬性的更改,或者
  • 使用SwingWorker的發布/處理方法對,可以將數據從SwingWorker傳輸到EDT上的GUI。

我本人更喜歡將PropertyChangeListener添加到我的SwingWorker(在EDT上),並從此偵聽器中更新JProgressBar。 我認為,與第一種選擇相比,它可以實現更好的代碼分離,並具有更低的耦合度和更高的內聚性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM