Некоторые сомнения связаны с использованием метода SwingUtilities.invokeLater() в программе Java Swing.

Я изучаю Java Swing, и у меня есть некоторые сомнения, связанные с этим простым учебником кода, который я читаю:

package com.andrea.execute;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

/* An istance of a SimpleExample class is a JFrame object: a top level container */
public class SimpleExample extends JFrame {

    /* Create a new SimpleExample object (that is a JFrame object) and set some property */
    public SimpleExample() {
        setTitle("Simple example");
        setSize(300, 200);
        setLocationRelativeTo(null);                // Center the window on the screen. 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SimpleExample ex = new SimpleExample();
                ex.setVisible(true);
            }
        });
    }
}

Логика довольно проста: у меня есть класс SimpleExample, который наследуется от класса JFrame Swing. Таким образом, SimpleExample будет контейнером верхнего уровня.

Этот класс также содержит метод main(), и теперь у меня есть 2 сомнения:

1) Почему в методе main() выполняется этот код:

SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SimpleExample ex = new SimpleExample();
                ex.setVisible(true);
            }
        });

Он вызывает метод invokeLater() класса SwingUtilities и передает ему новый объект Runnable.

Читая документацию, я знаю, что это способ поместить приложение в очередь событий Swing. Он используется для обеспечения безопасности всех обновлений пользовательского интерфейса.

У меня есть проблема с пониманием того, как это реализовано.

Внутри входного параметра метода invokeLater() он передает этот "материал":

new Runnable() {
        @Override
        public void run() {
            SimpleExample ex = new SimpleExample();
            ex.setVisible(true);
        }
    });

Что это такое? Что представляет? и как это работает?

Tnx

Andrea

3 ответа

Решение

Это анонимный класс, который реализует интерфейс Runnable.

Вы можете использовать его без анонимного класса, как:

class SimpleExample extends JFrame {

    public SimpleExample() {
        setTitle("Simple example");
        setSize(300, 200);
        setLocationRelativeTo(null);                
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new App());
    }
}

class App implements Runnable {

    public void run() {
        SimpleExample ex = new SimpleExample();
        ex.setVisible(true);
    }
}

Но анонимный класс удобнее.

javax.swing.SwingUtilities#invokeLater(Runnable doRun), график java.lang.Runnable для выполнения в потоке событий (может вызываться из любого потока);

Runnable - это интерфейс, который содержит метод run. Для вызова invokeLater эта реализация runnable необходима для вызова переданного метода run из колебательного потока.

Смотрите эту ссылку, чтобы получить более подробную информацию http://en.wikibooks.org/wiki/Java_Programming/Threads_and_Runnables

Другие вопросы по тегам