swing Samouczek
Pierwsze kroki z huśtawką
Szukaj…
Uwagi
Swing został zastąpiony przez JavaFX . Oracle ogólnie zaleca tworzenie nowych aplikacji przy użyciu JavaFX. Nadal: Swing będzie obsługiwany w Javie w dającej się przewidzieć przyszłości. JavaFX również dobrze integruje się z Swing, aby umożliwić płynne przenoszenie aplikacji.
Zdecydowanie zaleca się, aby większość komponentów Swing znajdowała się w wątku wysyłki zdarzeń. Łatwo zapomnieć o połączeniu konfiguracji GUI w invokeLater
połączenie. Z dokumentacji Java:
Kod obsługi zdarzenia Swing działa w specjalnym wątku znanym jako wątek wysyłki zdarzeń. Większość kodu wywołującego metody Swing również działa w tym wątku. Jest to konieczne, ponieważ większość metod obiektowych Swinga nie jest „bezpiecznych dla wątków”: wywoływanie ich z wielu wątków grozi interferencją wątków lub błędami spójności pamięci. Niektóre metody komponentu Swing są oznaczone w specyfikacji API jako „bezpieczne dla wątków”; można je bezpiecznie wywołać z dowolnego wątku. Wszystkie inne metody komponentu Swing muszą być wywoływane z wątku wysyłki zdarzeń. Programy, które ignorują tę regułę, mogą przez większość czasu działać poprawnie, ale występują w nich nieprzewidywalne błędy, które są trudne do odtworzenia.
Ponadto, chyba że z ważnego powodu, zawsze upewnij się, że setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
przeciwnym razie być może będziesz musiał poradzić sobie z wyciekiem pamięci, jeśli zapomnisz zniszczyć JVM.
Zwiększanie za pomocą przycisku
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);
}
}
Wynik
Jak przycisk „Kliknij mnie!” zostanie naciśnięty, liczba kliknięć wzrośnie o jeden:
"Witaj świecie!" w tytule okna z 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);
});
}
}
Wewnątrz main
metody:
W pierwszym wierszu SwingUtilities.invokeLater
jest SwingUtilities.invokeLater
i przekazywane jest do niego wyrażenie lambda z blokiem kodu () -> {...}
. Wykonuje to przekazane wyrażenie lambda na EDT, które jest skrótem od wątku wysyłania zdarzeń, zamiast głównego wątku. Jest to konieczne, ponieważ w bloku kodu wyrażenia lambda znajdują się komponenty Swing, które zostaną utworzone i zaktualizowane.
Wewnątrz bloku kodu wyrażenia lambda:
W pierwszym wierszu tworzona jest nowa instancja JFrame
nazwie frame
przy użyciu new JFrame("Hello World!")
. To tworzy instancję okna z „Hello World!” w tytule. Następnie w drugim wierszu frame
jest skonfigurowana na EXIT_ON_CLOSE
. W przeciwnym razie okno zostanie po prostu zamknięte, ale wykonanie programu pozostanie aktywne. Trzeci wiersz konfiguruje instancję frame
o szerokości 200 pikseli i wysokości 100 pikseli za pomocą metody setSize
. Do tej pory wykonanie w ogóle nic nie pokaże. Dopiero po wywołaniu setVisible(true)
w czwartej linii instancja frame
jest skonfigurowana do wyświetlania na ekranie.
"Witaj świecie!" w tytule okna z kompatybilnością
Korzystając z java.lang.Runnable
tworzymy „Hello World!” przykład dostępny dla użytkowników Java z wersjami sięgającymi wstecz do wydania 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);
}
});
}
}