Некоторые сомнения связаны с использованием метода 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