Ricerca…


Osservazioni

Swing è stato sostituito da JavaFX . In genere, Oracle consiglia di sviluppare nuove applicazioni con JavaFX. Ancora: Swing sarà supportato in Java per il prossimo futuro. JavaFX si integra bene anche con Swing, per consentire applicazioni di transizione senza problemi.

Si consiglia vivamente di avere la maggior parte dei componenti Swing sul thread di invio eventi. È facile dimenticare di raggruppare la configurazione della GUI in una chiamata invokeLater . Dalla documentazione Java:

Il codice di gestione degli eventi Swing viene eseguito su un thread speciale noto come thread di invio degli eventi. La maggior parte del codice che richiama i metodi Swing viene eseguito anche su questo thread. Ciò è necessario perché la maggior parte dei metodi degli oggetti Swing non sono "thread-safe": il loro richiamo da più thread rischia di interferire con i thread o errori di coerenza della memoria. Alcuni metodi del componente Swing sono etichettati come "thread safe" nella specifica API; questi possono essere tranquillamente richiamati da qualsiasi thread. Tutti gli altri metodi del componente Swing devono essere richiamati dal thread di invio dell'evento. I programmi che ignorano questa regola potrebbero funzionare correttamente la maggior parte del tempo, ma sono soggetti a errori imprevedibili e difficili da riprodurre.

Inoltre, a meno che non sia una buona ragione, assicurati sempre di aver chiamato setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) altrimenti potresti dover gestire una perdita di memoria se ti dimentichi di distruggere la JVM.

Incremento con un pulsante

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);
    }
}

Risultato

Come il pulsante con l'etichetta "Click me!" viene premuto il conteggio dei clic aumenterà di uno:

Programma in esecuzione

"Ciao mondo!" sul titolo della finestra con 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);
        });
    }
}

All'interno del metodo main :
Sulla prima riga viene chiamato SwingUtilities.invokeLater viene SwingUtilities.invokeLater un'espressione lambda con un blocco di codice () -> {...} . Esegue l'espressione lambda passata sull'EDT, che è l'abbreviazione di Event Dispatch Thread, invece del thread principale. Questo è necessario, perché all'interno del blocco di codice dell'espressione lambda, ci saranno componenti Swing che verranno creati e aggiornati.

All'interno del blocco di codice dell'espressione lambda:
Sulla prima riga, una nuova istanza JFrame chiamata frame viene creata usando il new JFrame("Hello World!") . Questo crea un'istanza di finestra con "Hello World!" sul suo titolo. Successivamente sulla seconda riga il frame è configurato su EXIT_ON_CLOSE . Altrimenti la finestra verrà chiusa, ma l'esecuzione del programma rimarrà attiva. La terza riga configura l'istanza del frame con una larghezza di 200 pixel e un'altezza di 100 pixel utilizzando il metodo setSize . Fino ad ora l'esecuzione non mostrerà nulla. Solo dopo aver chiamato setVisible(true) sulla quarta riga, l'istanza del frame è configurata per apparire sullo schermo.

"Ciao mondo!" sul titolo della finestra con compatibilità

Usando java.lang.Runnable facciamo il nostro "Hello World!" esempio disponibile per gli utenti Java con versioni risalenti alla versione 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow