0

アップローダに Java FTP を使用してファイルをアップロードしてもらいました。ラベルと進行状況バーを更新したいと思います。パーセント テキストのラベル、パーセント int 値のバー。現在、現在のコードでは、アップロードの最後に 100 と完全なバーしか取得できません。アップロード中にそれらのどれも変更されません。

ここにあります:

    OutputStream output = new BufferedOutputStream(ftpOut);
    CopyStreamListener listener = new CopyStreamListener() {
        public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
            System.out.printf("\r%-30S: %d / %d", "Sent", totalBytesTransferred, streamSize);
            ftpup.this.upd(totalBytesTransferred,streamSize);
        }
        public void bytesTransferred(CopyStreamEvent arg0) { }
    };

    Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);      
}

public void upd(long num, long size){
    int k = (int) ((num*100)/size);
    System.out.println(String.valueOf(k));
    this.d.setText(String.valueOf(k));
    //d.setText(String.valueOf(k));
    progressBar.setValue(k);
}
4

3 に答える 3

2

その音から(そしてコンツリーへの証拠が欠けている)、イベントディスパッチスレッドで時間のかかるアクションを処理しているように聞こえます

さらに洞察を得るために、Swing での同時実行をお読みになることをお勧めします。

SwingWorkerを使用して実際の転送を実行し、組み込みの進行中のサポートを利用することをお勧めします

ソースコードを見てUPDATE

  1. 重量コンポーネントと軽量コンポーネントを混在させないでください。に変更AppletJAppletに変更TextField、使用JTextFieldしないまたはを使用CanvasJPanelJComponent
  2. 他の人があなたのコードを読むことを期待している場合は、変数に適切な名前を使用してくださいp
  3. あなたThreadは駄目です。スレッドを開始してそのrunメソッドを使用するのではなく、そのコンストラクター内でダウンロード呼び出しを行うだけです。これはあなたのために何もしません...

の実装を削除してMyThread置き換えます

public class MyWorker extends SwingWorker<Object, Object> {

    private URL host;
    private File outputFile;

    public MyWorker(URL host, File f) {
        this.host = host;
        outputFile = f;
    }

    @Override
    protected Object doInBackground() throws Exception {

        // You're ignoring the host you past in to the constructor
        String hostName = "localhost";
        String username = "un";
        String password = "pass";
        String location = f.toString();

        //FTPClient ftp = null;

        ftp.connect(hostName, 2121);
        ftp.login(username, password);

        ftp.setFileType(FTP.BINARY_FILE_TYPE);

        ftp.setKeepAlive(true);
        ftp.setControlKeepAliveTimeout(3000);
        ftp.setDataTimeout(3000); // 100 minutes
        ftp.setConnectTimeout(3000); // 100 minutes

        ftp.changeWorkingDirectory("/SSL");

        int reply = ftp.getReplyCode();
        System.out.println("Received Reply from FTP Connection:" + reply);

        if (FTPReply.isPositiveCompletion(reply)) {
            System.out.println("Connected Success");
        }
        System.out.println(f.getName().toString());

        File f1 = new File(location);
        in = new FileInputStream(f1);

        FileInputStream input = new FileInputStream(f1);
        // ftp.storeFile(f.getName().toString(),in);

        //ProgressMonitorInputStream is= new ProgressMonitorInputStream(getParent(), "st", in);
        OutputStream ftpOut = ftp.storeFileStream(f.getName().toString());


        System.out.println(ftpOut.toString());
        //newname hereSystem.out.println(ftp.remoteRetrieve(f.toString()));
        OutputStream output = new BufferedOutputStream(ftpOut);
        CopyStreamListener listener = new CopyStreamListener() {
            public void bytesTransferred(final long totalBytesTransferred, final int bytesTransferred, final long streamSize) {

                setProgress((int) Math.round(((double) totalBytesTransferred / (double) streamSize) * 100d));

            }

            @Override
            public void bytesTransferred(CopyStreamEvent arg0) {
                // TODO Auto-generated method stub
            }
        };

        Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);

        return null;

    }
}

あなたActionListenero(??) で、スレッド実行コードを次のように置き換えます

try {
    MyWorker worker = new MyWorker(new URL("http://localhost"), file);
    worker.addPropertyChangeListener(new PropertyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if (evt.getPropertyName().equals("progress")) {
                Integer progress = (Integer) evt.getNewValue();
                progressBar.setValue(progress);
            }
        }
    });
    worker.execute();
} catch (MalformedURLException ex) {
    ex.printStackTrace();
}

ノート。コンストラクターに渡す URL を無視しています。http:// は ftp:// ではないので、うまくいくとは思えません...

于 2012-08-29T20:39:17.537 に答える
1

アップロードと GUI の変更を同じスレッドで実行するため、アップロード中に GUI への変更は表示されません。アップロードを行うスレッドを 1 つ開始し、GUI の更新を行う EDT (Event-Dispatch-Thread) で別のスレッドを開始する必要があります。

詳細については、次を参照してください。

  1. イベントディスパッチスレッド
于 2012-08-29T20:34:17.610 に答える
1

SwingWorker に転送ロジックを実装する必要があります。これにより、UI が進行状況を表示できるようになります。

于 2012-08-29T20:35:28.520 に答える