6

インターネットからファイルをダウンロードするためにJava関数を使用しています。

public void getLatestRelease()
{
    try
    {
        // Function called
        long startTime = System.currentTimeMillis();

        // Open connection
        System.out.println("Connecting...");
        URL url = new URL(latestReleaseUrl);
        url.openConnection();

        // Download routine
        InputStream reader = url.openStream();
        FileOutputStream writer = new FileOutputStream("release.zip");

        byte[] buffer = new byte[153600];
        int totalBytesRead = 0;
        int bytesRead = 0;

        while ((bytesRead = reader.read(buffer)) > 0)
        {
            writer.write(buffer, 0, bytesRead);
            buffer = new byte[153600];
            totalBytesRead += bytesRead;
        }

        // Download finished
        long endTime = System.currentTimeMillis();

        // Output download information
        System.out.println("Done.");
        System.out.println((new Integer(totalBytesRead).toString()) + " bytes read.");
        System.out.println("It took " + (new Long(endTime - startTime).toString()) + " milliseconds.");

        // Close input and output streams
        writer.close();
        reader.close();
    }

    // Here I catch MalformedURLException and IOException :)
}

そして、ダウンロードの進行状況を視覚化することになっているJProgressBarコンポーネントがあります。JPanel

private static void createProgressBar(JPanel panel)
{
    JProgressBar progressBar = new JProgressBar(0, 100);
    progressBar.setValue(0);
    progressBar.setStringPainted(true);
    panel.add(progressBar, BorderLayout.SOUTH);
}

WebアプリケーションのMVCと同様に、ユーザーに表示される「フロントエンド」ビューから「バックエンド」機能を分離したいと思います。

したがって、関数はクラスgetLatestRelease()のパッケージにあります。frameworkMyFramework

イベントリスナーを含む、インターフェイス生成に関連するすべてSwingのものがパッケージに含まれていますfrontend

メインクラスで、パッケージのメインクラスであるのインスタンスとのControllerインスタンスを作成します。MyFrameworkApplicationFrontendfrontend

progressBar問題は、ダウンロードの進行状況に応じて、値を更新する方法です。

4

1 に答える 1

7

スイングでMVCを実行したい場合、SwingWorkerクラスが思い浮かびます。
SwingWorkerには、を使用して聞くことができる「progress」と呼ばれるプロパティが付属していますPropertyChangeListener

進行状況イベントは、そのメソッドを使用してSwingWorkerから発生させることができますsetProgress(int 0-100)。したがって、ここでは、進行状況の概念を使用してファイルをバックグラウンドでロードするためのものです(進行状況のパーセンテージを計算できるようにするには、ファイルのサイズを把握しておく必要があることに注意してください)。

進行状況の表示は、2つのオプションを使用して実行できます。1つJProgressBarは完全な制御用、もう1つProgressMonitorは進行状況バーを含むほぼ自己管理のポップアップを表示するためです。違いを確認するには、 チュートリアルを参照してください。

解決策1

彼らが言うように、あなたがに行き、ProgressMonitorあなたのバックグラウンドタスクがからの読み取りである場合、 setProgressを呼び出したり「progress」プロパティを聞いたりすることなくInputStream、クラスを使用して読み取りと進行状況の表示を行うことができます。ProgressMonitorInputStream

解決策2

手動で行う場合は、setProgressを呼び出すSwingWorker読み込みタスクを作成し、必要に応じてProgressMonitor(またはJProgressBar)をインスタンス化し、SwingWorkerにPropertyChangeListenerを登録して、「進行状況」の変更をチェックし、モニター/バーを更新します。によると。

注: PropertyChangeListenerを通過することは重要です。これは、モデル(タスク)をビュー(スイング進行状況コンポーネント)から切り離し、EDTの使用規則に従うためです。

于 2012-08-14T08:45:10.640 に答える