swing Tutorial
Erste Schritte mit Swing
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:
"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);
}
});
}
}