Поиск…


замечания

Swing был заменен JavaFX . Обычно Oracle рекомендует разрабатывать новые приложения с помощью JavaFX. Тем не менее: Swing будет поддерживаться на Java в обозримом будущем. JavaFX также хорошо интегрируется с Swing, чтобы плавное переключение приложений.

Настоятельно рекомендуется иметь большинство ваших компонентов Swing в Thread Dispatch Thread. Легко забыть связать вашу настройку графического интерфейса с invokeLater . Из документации Java:

Код обработки событий Swing запускается в специальном потоке, известном как поток отправки событий. В этом потоке также работает большинство кода, который вызывает методы Swing. Это необходимо, потому что большинство методов объекта Swing не являются «потокобезопасными»: вызывать их из нескольких потоков подвергает потоку помехи или ошибки согласованности памяти. Некоторые методы компонента Swing помечены как «потокобезопасные» в спецификации API; они могут быть безопасно вызваны из любого потока. Все остальные методы компонента Swing должны быть вызваны из потока отправки событий. Программы, которые игнорируют это правило, могут нормально функционировать большую часть времени, но подвержены непредсказуемым ошибкам, которые трудно воспроизвести.

Кроме того, если по уважительной причине всегда убедитесь, что вы вызвали setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) иначе вам, возможно, придется иметь дело с утечкой памяти, если вы забудете уничтожить JVM.

Увеличение с помощью кнопки

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

Результат

Как кнопка с надписью «Click me!» нажата, количество кликов увеличится на единицу:

Запуск программы

"Привет, мир!" по названию окна с лямбдой

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

Внутри main метода:
В первой строке SwingUtilities.invokeLater и SwingUtilities.invokeLater ему лямбда-выражение с блоком кода () -> {...} . Это выполняет переданное лямбда-выражение на EDT, которое является коротким для Thread Dispatch Thread, а не основного потока. Это необходимо, потому что внутри блока кода выражения лямбда есть компоненты Swing, которые будут созданы и обновлены.

Внутри блока кода выражения лямбда:
В первой строке создается новый экземпляр JFrame называемый frame с использованием new JFrame("Hello World!") . Это создает экземпляр окна с «Hello World!». по его названию. Затем во второй строке frame настроен на EXIT_ON_CLOSE . В противном случае окно будет просто закрыто, но выполнение программы будет оставаться активным. Третья строка настраивает экземпляр frame setSize 200 пикселей и высотой 100 пикселей с использованием метода setSize . До сих пор казнь вообще ничего не обнаружила. Только после вызова setVisible(true) в четвертой строке экземпляр frame настроен для отображения на экране.

"Привет, мир!" по названию окна с совместимостью

Используя java.lang.Runnable мы делаем наш «Hello World!». пример, доступный для пользователей Java с версиями, датированными вплоть до версии 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow