-1

ご覧のとおり、私は調査しており、main.javaクラスにスレッドを設定しようとしました。これが主な方法です。

public static void main(String args[]) {     
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new main().setVisible(true);
            check ch = new check();
            ch.start();          
        }
    });
}

main メソッドは、 check.javaクラスからchというスレッドを呼び出します。

これはスレッドクラスです:

public class check extends Thread {

    public JTextArea estado = new JTextArea();   
    public JTextField updatedVersion = new JTextField();
    public JLabel updatedLabel = new JLabel();
    public String catchUpdatedVersion;
    int UPDATENUMBER;
    int CURRENTNUMBER;

    public void run() {
        String infURL = "https://thread.googlecode.com/svn/trunk/thread.inf";
        String name = "thread.inf";
        File file = new File(name);
        try {
            URLConnection conn = new URL(infURL).openConnection();
            conn.connect();
            estado.append("Conectando al servidor...");
            estado.append(System.getProperty("line.separator"));
            estado.append(" -- Buscando actualizaciones... --");
            estado.append(System.getProperty("line.separator"));
            InputStream in = conn.getInputStream();
            OutputStream out = new FileOutputStream(file);
            int b = 0;
            while (b != -1) {
                b = in.read();
                if (b != -1) {
                    out.write(b);
                }
            }
            out.close();
            in.close();
        } catch (MalformedURLException ex) {
        } catch (IOException ioe) { }

        String fileToReadUpdatedVersion = "thread.inf";
        try {
            BufferedReader br = new BufferedReader(
                    new FileReader(fileToReadUpdatedVersion));
            String brr = br.readLine();
            catchUpdatedVersion = brr.substring(34,42);
            String catchUpdatedShortVersion = brr.substring(15,16);
            UPDATENUMBER = Integer.parseInt(catchUpdatedShortVersion);

            String fileToReadCurrentVer = "thread.inf";
            BufferedReader brrw = new BufferedReader(
                                new FileReader(fileToReadCurrentVer));
            String brrwREAD = brrw.readLine();
            String catchCurrentShortVersion = brrwREAD.substring(15,16);
            CURRENTNUMBER = Integer.parseInt(catchCurrentShortVersion);

            if (CURRENTNUMBER >= UPDATENUMBER) {
                estado.setText("No se han encontrado actualizaciones.");
            } else {
                updatedVersion.setForeground(new Color(0,102,0));
                updatedLabel.setForeground(new Color(0,153,51));
                updatedVersion.setText(catchUpdatedVersion);
                estado.append("-------------------" +
                        "NUEVA ACTUALIZACIÓN DISPONIBLE: " +
                            catchUpdatedVersion + " -------------------");;
                estado.append(System.getProperty("line.separator"));
                estado.append("Descargando actualizaciones... " +
                            "Espere por favor, no cierre este " +
                                "programa hasta que esté completado...");
                try {
                    String updateURL = "https://thread.googlecode.com/" +
                                                    "svn/trunk/thread.inf";
                    String updatedname = (catchUpdatedVersion + ".zip");
                    File updatedfile = new File(updatedname);
                    URLConnection conn = new URL(updateURL).openConnection();
                    conn.connect();
                    estado.append(System.getProperty("line.separator"));
                    estado.append("   Archivo actual: " + updatedname);
                    estado.append(System.getProperty("line.separator"));
                    estado.append("   Tamaño: " + 
                        conn.getContentLength() / 1000 / 1000 + " MB");
                    InputStream in = conn.getInputStream();
                    OutputStream out = new FileOutputStream(updatedfile);
                    int c = 0;
                    while (c != -1) {
                        c = in.read();
                        if (c != -1) {
                            out.write(c);
                        }
                    }
                    out.close();
                    in.close();    
                } catch (MalformedURLException ex) {
                    ex.printStackTrace();
                }
            }
        } catch (IOException ioe) {
            System.out.println(ioe);
            ioe.printStackTrace();
        }
    }
}

プログラムを実行すると、スレッドが正常に動作しません。ファイルをダウンロードし、その進行状況をmain.javaクラスの JTextArea に表示することになっています。ファイルはダウンロードされますが、JTextArea には何も表示されません。

私の間違いはどこですか?

編集:すべてのコードを表示します。

4

1 に答える 1

1

問題#1

更新しようとしているコンポーネントは、画面に接続されていません...

public JTextArea estado = new JTextArea();   
public JTextField updatedVersion = new JTextField();
public JLabel updatedLabel = new JLabel();

つまり、これらのコンポーネントと対話するときはいつでも、画面上に何もしていません...

問題#2

イベント ディスパッチ スレッドのコンテキスト外から UI を変更しようとしています。これは、Swing のスレッド化規則に対する重大な違反です。

public class Check extends SwingWorker<String, String> {

    private JTextArea estado;   
    Private JTextField updatedVersion;
    private JLabel updatedLabel;
    private String catchUpdatedVersion;
    int UPDATENUMBER;
    int CURRENTNUMBER;

    public Check(JTextArea estado, JTextField updatedVersion, JLabel updatedLabel) {
        this.estado = estado;
        this.updatedVersion = updatedVersion;
        this.updatedLabel = updatedLabel;
    }

    protected void process(List<String> values) {
        for (String value : values) {
            estado.append(value);
        }
    }

    protected String doInBackground() throws Exception {
        String infURL = "https://thread.googlecode.com/svn/trunk/thread.inf";
        String name = "thread.inf";
        File file = new File(name);

        URLConnection conn = new URL(infURL).openConnection();
        conn.connect();
        publish("Conectando al servidor...");
        publish(System.getProperty("line.separator"));
        publish(" -- Buscando actualizaciones... --");
        publish(System.getProperty("line.separator"));
        /*...*/          
    }
}

後処理を行う必要がある場合は、存在しdoneた後に呼び出されるものもオーバーライドしdoInBackgroundますが、EDT のコンテキスト内で呼び出されます。

詳細については、Swing での同時実行を参照してください。

于 2013-09-28T20:54:00.723 に答える