Suche…


Bemerkungen

Swing wurde durch JavaFX ersetzt . Oracle empfiehlt im Allgemeinen die Entwicklung neuer Anwendungen mit JavaFX. Trotzdem: Swing wird auf absehbare Zeit in Java unterstützt. JavaFX lässt sich auch gut in Swing integrieren, um den reibungslosen Übergang von Anwendungen zu ermöglichen.

Es wird dringend empfohlen, die meisten Ihrer Swing-Komponenten im Event Dispatch-Thread zu haben. Es ist leicht zu vergessen, Ihr GUI-Setup in einem Aufruf von invokeLater zu bündeln. Aus der Java-Dokumentation:

Der Swing-Ereignisbehandlungscode wird in einem speziellen Thread ausgeführt, der als Event-Dispatch-Thread bezeichnet wird. Der meiste Code, der Swing-Methoden aufruft, wird auch in diesem Thread ausgeführt. Dies ist notwendig, da die meisten Swing-Objektmethoden nicht "threadsicher" sind: Wenn Sie sie von mehreren Threads aus aufrufen, können Thread-Interferenzen oder Speicherkonsistenzfehler auftreten. Einige Swing-Komponentenmethoden werden in der API-Spezifikation als "threadsicher" bezeichnet. Diese können von jedem Thread aus sicher aufgerufen werden. Alle anderen Swing-Komponentenmethoden müssen vom Event-Dispatch-Thread aus aufgerufen werden. Programme, die diese Regel ignorieren, funktionieren meistens korrekt, unterliegen jedoch unvorhersehbaren Fehlern, die schwer zu reproduzieren sind.

Auch, es sei denn aus gutem Grund, immer darauf achten , dass Sie angerufen setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) oder sonst könnten Sie möglicherweise mit einem Speicherverlust zu tun haben , wenn Sie vergessen , die JVM zu zerstören.

Mit einer Taste inkrementieren

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

Ergebnis

Wie der Button "Klick mich!" gedrückt wird, erhöht sich die Klickanzahl um eins:

Laufendes Programm

"Hallo Welt!" auf Fenstertitel mit 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);
        });
    }
}

Innerhalb des main
In der ersten Zeile wird SwingUtilities.invokeLater aufgerufen und ein Lambda-Ausdruck mit einem Block aus code () -> {...} wird an ihn übergeben. Dies führt den übergebenen Lambda-Ausdruck im EDT aus, der für Event Dispatch Thread anstelle des Hauptthreads steht. Dies ist notwendig, da im Codeblock des Lambda-Ausdrucks Swing-Komponenten erstellt und aktualisiert werden.

Innerhalb des Codeblocks des Lambda-Ausdrucks:
In der ersten Zeile wird eine neue JFrame Instanz namens " frame mit dem new JFrame("Hello World!") . Dadurch wird eine Fensterinstanz mit "Hello World!" Erstellt. auf dem Titel. Anschließend wird in der zweiten Zeile der frame auf EXIT_ON_CLOSE konfiguriert. Andernfalls wird das Fenster nur geschlossen, die Ausführung des Programms bleibt jedoch aktiv. Die dritte Zeile konfiguriert die frame Instanz mit der setSize Methode auf 200 Pixel Breite und 100 Pixel Höhe. Bis jetzt zeigt die Hinrichtung überhaupt nichts. Erst nach dem Aufruf von setVisible(true) in der vierten Zeile wird die frame Instanz so konfiguriert, dass sie auf dem Bildschirm angezeigt wird.

"Hallo Welt!" auf Fenstertitel mit Kompatibilität

Mit java.lang.Runnable machen wir unsere "Hallo Welt!" Beispiel für Java-Benutzer mit Versionen bis zur 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow