Recherche…


Remarques

Swing a été remplacé par JavaFX . Oracle recommande généralement de développer de nouvelles applications avec JavaFX. Still: Swing sera supporté en Java dans un avenir prévisible. JavaFX s'intègre également bien avec Swing, pour permettre aux applications de transition de se dérouler sans heurts.

Il est fortement recommandé d'avoir la plupart de vos composants Swing sur le thread de répartition des événements. Il est facile d'oublier de regrouper votre configuration graphique dans un appel invokeLater . De la documentation Java:

Le code de gestion des événements Swing s'exécute sur un thread spécial appelé thread de distribution des événements. La plupart des codes qui invoquent les méthodes Swing s'exécutent également sur ce thread. Cela est nécessaire car la plupart des méthodes d'objet Swing ne sont pas "thread-safe": les invoquer à partir de plusieurs threads risque de provoquer des erreurs d'interférence ou de cohérence de la mémoire. Certaines méthodes de composant Swing sont étiquetées "thread safe" dans la spécification de l'API; ceux-ci peuvent être invoqués en toute sécurité à partir de n'importe quel thread. Toutes les autres méthodes du composant Swing doivent être appelées à partir du thread de distribution des événements. Les programmes qui ignorent cette règle peuvent fonctionner correctement la plupart du temps mais sont sujets à des erreurs imprévisibles difficiles à reproduire.

De plus, à moins que ce ne soit pour une bonne raison, assurez-vous toujours que vous avez appelé setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) sinon vous pourriez avoir à gérer une fuite de mémoire si vous oubliez de détruire la JVM.

Incrémenter avec un bouton

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * A very simple Swing example.
 */
public class SwingExample {
    /**
     * The number of times the user has clicked the button.
     */
    private long clickCount;
    
    /**
     * The main method: starting point of this application.
     *
     * @param arguments the unused command-line arguments.
     */
    public static void main(final String[] arguments) {
        new SwingExample().run();
    }

    /**
     * Schedule a job for the event-dispatching thread: create and show this
     * application's GUI.
     */
    private void run() {
        SwingUtilities.invokeLater(this::createAndShowGui);
    }
    
    /**
     * Create the simple GUI for this application and make it visible.
     */
    private void createAndShowGui() {
        // Create the frame and make sure the application exits when the user closes
        // the frame.
        JFrame mainFrame = new JFrame("Counter");
        mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        // Add a simple button and label.
        JPanel panel = new JPanel();
        JButton button = new JButton("Click me!");
        JLabel label = new JLabel("Click count: " + clickCount);
        panel.add(button);
        panel.add(label);
        mainFrame.getContentPane().add(panel);
        
        // Add an action listener to the button to increment the count displayed by
        // the label.
        button.addActionListener(actionEvent -> {
            clickCount++;
            label.setText("Click count: " + clickCount);
        });
        
        // Size the frame.
        mainFrame.setBounds(80, 60, 400, 300);
        //Center on screen
        mainFrame.setLocationRelativeTo(null);
        //Display frame
        mainFrame.setVisible(true);
    }
}

Résultat

Comme le bouton intitulé "Cliquez moi!" est appuyé sur le nombre de clics va augmenter d'un:

Programme de course

"Bonjour le monde!" sur le titre de la fenêtre avec lambda

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Hello World!");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setSize(200, 100);
            frame.setVisible(true);
        });
    }
}

Dans la méthode main :
Sur la première ligne, SwingUtilities.invokeLater est appelée et une expression lambda avec un bloc de code () -> {...} est transmise. Cela exécute l'expression lambda passée sur l'EDT, qui est l'abréviation de Event Dispatch Thread, au lieu du thread principal. Cela est nécessaire car dans le bloc de code de l'expression lambda, des composants Swing doivent être créés et mis à jour.

Dans le bloc de code de l'expression lambda:
Sur la première ligne, une nouvelle instance de JFrame appelée frame est créée à l'aide du new JFrame("Hello World!") . Cela crée une instance de fenêtre avec "Hello World!" sur son titre. Ensuite, sur la deuxième ligne, le frame est configuré sur EXIT_ON_CLOSE . Sinon, la fenêtre sera simplement fermée, mais l'exécution du programme restera active. La troisième ligne configure l'instance du frame sur 200 pixels de largeur et 100 pixels de hauteur à l'aide de la méthode setSize . Jusqu'à présent, l'exécution ne montre rien du tout. Seulement après avoir appelé setVisible(true) sur la quatrième ligne, l'instance du frame est configurée pour apparaître à l'écran.

"Bonjour le monde!" sur le titre de la fenêtre avec compatibilité

Utiliser java.lang.Runnable nous faisons notre "Hello World!" exemple disponible pour les utilisateurs de Java avec des versions datant de la version 1.2:

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Main {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run(){
                JFrame frame = new JFrame("Hello World!");
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setSize(200, 100);
                frame.setVisible(true);
            }
        });
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow