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:

Uruchamianie programu

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow