Salve a tutti. Mi capita uno stranissimo problema riguardo i componenti grafici Swing... ma ora vi spiego prima a cosa serve il programma che sto sviluppando: sto creando un programma che mi consente di collegarmi ad un sito internet e scaricare il suo catalogo di articoli. Questo sito ha una struttura specifica di directory che vado a creare, e con appositi script PHP che fanno da ponte tra la mia applicazione Java e il database MySQL che si trova on-line.
Siccome č un programma che lavora quasi completamente facendo richieste POST agli script PHP, io ho bisogno di una JProgressBar con progressione indeterminata o determinata. Quindi ho creato una classe apposita, che mi consente facilmente di creare un piccolo JDialog con una JLabel e una JProgressBar, da mostrare quando si sta effettuando una richiesta POST, che indica all'utente che c'č una connessione in corso e che bisogna attendere.
Ecco la classe:
codice:
package classes;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import java.awt.FlowLayout;

public class ProgressBar
{
    private JProgressBar bar;
    private JDialog d;

    public void createIndeterminateBar()
    {
        bar = new JProgressBar();
        bar.setIndeterminate(true);
    }

    public void createDeterminateBar (int min, int max)
    {
        bar = new JProgressBar(min, max);
        bar.setValue (min);
    }
    
    public void showBar (final String title, final String message)
    {
        JLabel label = new JLabel (message);

        d = new JDialog();
        d.setTitle (title);
        d.setSize (200, 90);
        d.setLocationRelativeTo (null);
        d.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        d.setLayout(new FlowLayout());

        d.add (label);
        d.add (bar);

        d.setVisible (true);
    }

    public void closeBar()
    {
        d.dispose();
        d = null;
        bar = null;
    }
    
    public void setValue (int value)
    {
        bar.setValue(value);
    }

    public JProgressBar getBar()
    {
        return bar;
    }
}
Il mio problema č che, se creo un oggetto di tale classe e mostro il JDialog utilizzando il metodo showBar(), il JDialog viene visualizzato, ma il contenuto della finestra č grigio! Non c'č nč la JLabel nč la JProgressBar! Ho notato che solo in determinati punti del programma succede questa cosa (proprio in quei punti in cui ne ho bisogno!). Ho pensato subito alla gestione dei Thread, ho provato con SwingUtilities.invokeLater oppure creare un Thread apposito... e per certi versi funzionava! Ma capii che non faceva al caso mio poichč se utilizzassi un altro Thread, non potrei pił sapere quand'č che la richiesta POST finirą!
Vi posto la classe principale e in grassetto evidenzio le parti in cui uso tale classe:
codice:
import javax.swing.JDialog;
import javax.swing.JPasswordField;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JFileChooser;
import javax.imageio.ImageIO;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;

import java.io.File;

import java.net.URL;
import java.net.MalformedURLException;

import java.util.ArrayList;

import classes.*;

public class Catalog implements ActionListener
{
    private String website;
    private URL loginURL;
    private URL collectionsURL;
    private URL typesURL;
    private URL articlesURL;
    private JPasswordField passwordField;
    private JButton loginButton;
    private JDialog dialog;

    private ArrayList < Collection > collections;

    public Catalog (String website) throws MalformedURLException
    {
        this.website = website;
        this.loginURL = new URL (website + "/admin/CatalogDownload/login.php");
        this.collectionsURL = new URL (website + "/admin/CatalogDownload/collections.php");
        this.typesURL = new URL (website + "/admin/CatalogDownload/types.php");
        this.articlesURL = new URL (website + "/admin/CatalogDownload/articles.php");
        showLogin();
    }

    public void showLogin()
    {
        dialog = new JDialog();
        dialog.setTitle ("Accedi");
        dialog.setSize (200, 96);
        dialog.setResizable (false);
        dialog.setLocationRelativeTo (null);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setLayout(new FlowLayout());

        passwordField = new JPasswordField (10);
        passwordField.addActionListener (this);
        loginButton = new JButton ("Accedi");
        loginButton.addActionListener (this);

        dialog.add (passwordField);
        dialog.add (loginButton);

        dialog.setVisible (true);
    }

    private String login (String password)
    {
        dialog.dispose();
        ProgressBar bar = new ProgressBar();
        bar.createIndeterminateBar();
        bar.showBar("Attendere", "Verifica della password...");
        String response = null;
        try
        {
            RequestSender request = new RequestSender (loginURL);
            request.setMethod("POST");
            request.addParam("password", password);
            response = request.send();
        }
        catch (Exception exception)
        {
            exception.printStackTrace();
            JOptionPane.showMessageDialog (null, "Si č verificato un errore durante la connessione", "Errore", JOptionPane.ERROR_MESSAGE);
        }
        bar.closeBar();

        return response;
    }

    private void process (String password)
    {
        String res = login (password);
        if (!res.trim().equals ("ok"))
        {
            JOptionPane.showMessageDialog (null, res, "Errore", JOptionPane.ERROR_MESSAGE);
            showLogin();
        }
        else
        {
            collections = new ArrayList < Collection >();
            ProgressBar bar = new ProgressBar();
            bar.createIndeterminateBar();
            bar.showBar("Attendere", "Connessione in corso...");

            try
            {
                getCollections();
                getTypes();
                getArticles();
                bar.closeBar();
                download();
            }
            catch (Exception exception)
            {
                exception.printStackTrace();
                JOptionPane.showMessageDialog(null, "Si č verificato un errore durante il download del catalogo", "Errore", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    private void download() throws Exception
    {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setMultiSelectionEnabled(false);
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int ris = fileChooser.showSaveDialog(null);
        if (ris == JFileChooser.APPROVE_OPTION)
        {
            int dim = 0;
            for (Collection collection : collections)
                dim += collection.articles.size();

            ProgressBar bar = new ProgressBar();
            bar.createDeterminateBar(0, dim);
            bar.showBar("Attendere", "Download in corso...");

            File location = fileChooser.getSelectedFile();
            File directory = new File (location, "Catalogo");
            directory.mkdir();
            File articles = new File (directory, "articles");
            articles.mkdir();
            File images = new File (articles, "images");
            images.mkdir();
            File thumbs = new File (images, "thumbs");
            thumbs.mkdir();

            File[] images_files = images.listFiles();
            File[] thumbs_files = thumbs.listFiles();
            if (images_files.length > 0)
                for (File f : images_files)
                    if (f.isFile())
                        f.delete();

            if (thumbs_files.length > 0)
                for (File f : thumbs_files)
                    f.delete();


            for (Collection collection : collections)
            {
                for (Article article : collection.articles)
                {
                    if (!article.getImage().equals (""))
                    {
                        BufferedImage img = ImageIO.read(new URL(website + "/images/jewels/" + article.getImage()));
                        ImageIO.write(img, getExtension(article.getImage()), new File(images, article.getImage()));
                        bar.setValue(bar.getBar().getValue() + 1);
                    }
                }
            }

            bar.closeBar();
        }
    }

    private void getCollections() throws Exception
    {
        RequestSender requester = new RequestSender(collectionsURL);
        requester.setMethod("POST");
        String response = requester.send();
        String[] collectionsResponse = response.split("-newline-");
        for (String collectionResponse : collectionsResponse)
        {
            if (!collectionResponse.trim().equals(""))
            {
                String[] fields = collectionResponse.split("-separator-");
                Collection collection = new Collection();
                collection.setId(Integer.parseInt(fields[0]));
                collection.setName(fields[1]);
                collection.setDesc(fields[2]);

                this.collections.add (collection);
            }
        }
    }

    private void getTypes() throws Exception
    {
        for (Collection collection : collections)
        {
            RequestSender requester = new RequestSender(typesURL);
            requester.setMethod("POST");
            requester.addParam("id_collection", "" + collection.getId());
            String response = requester.send();
            String[] types = response.split("-newline-");

            for (String type : types)
                collection.types.add(type);
        }
    }

    private void getArticles() throws Exception
    {
        for (Collection collection : collections)
        {
            RequestSender requester = new RequestSender(articlesURL);
            requester.setMethod("POST");
            requester.addParam("id_collection", "" + collection.getId());
            String response = requester.send();
            String[] articles = response.split("-newline-");
            for (String articleResponse : articles)
            {
                String[] fields = articleResponse.split("-separator-");
                if (!articleResponse.trim().equals(""))
                {
                    Article article = new Article();
                    article.setId(Integer.parseInt(fields[0]));
                    article.setCode(fields[1]);
                    article.setCollections_id(Integer.parseInt(fields[2]));
                    article.setType(fields[3]);
                    article.setImage(fields[4]);
                    article.setCt_gold(fields[5]);
                    article.setCt_precious_stone(fields[6]);
                    article.setCt_diamond(fields[7]);
                    article.setGr_pearl(fields[8]);
                    article.setGr_coral(fields[9]);
                    article.setGr_semiprecious_stone(fields[10]);
                    article.setDescription(fields[11]);
                    article.setPrice(Float.parseFloat(fields[12]));
                    article.setDiscount(Integer.parseInt(fields[13]));

                    collection.articles.add(article);
                }
            }
        }
    }

    public String getPassword (JPasswordField field)
    {
        char[] characters = field.getPassword();
        String password = "";
        for (char c : characters)
            password += c;

        return password;
    }

	private String getExtension (String name)
	{
        String extension = "";
		int i = name.lastIndexOf ('.');

		if (i > 0 && i < name.length() - 1)
			extension = name.substring (i + 1).toLowerCase();

		return extension;
	}

    public void actionPerformed (ActionEvent event)
    {
        process (getPassword (passwordField));
    }
}
Grazie mille per l'attenzione, spero che qualcuno mi aiuti.