Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел покрытия JApplet
— class, который позволяет апплетам использовать компоненты Swing. JApplet
подкласс java.applet.Applet
, который покрывается следом
Любой апплет, который содержит компоненты Swing, должен быть реализован с подклассом JApplet
. Вот версия Swing одного из апплетов, которые помогли сделать Java известным — апплет анимации, который (в его самой известной конфигурации) показывает нашему Герцогу талисмана, делающему колеса телеги:
Если Вы не видите, что апплет работает, Вы должны установить
Можно найти основной исходный код для этого апплета в TumbleItem.java
.
Этот раздел обсуждает следующие темы:
Поскольку JApplet
верхний уровень контейнер Swing, у каждого апплета Swing есть корневая область. Самые значимые эффекты присутствия корневой области являются поддержкой добавления строки меню и потребности использовать область контента.
Как описано в Использовании Высокоуровневых Контейнеров, каждый высокоуровневый контейнер, таких как a JApplet
имеет единственную область контента. Область контента делает апплеты Swing отличающимися от регулярных апплетов следующими способами:
BorderLayout
. Это отличается от менеджера по расположению значения по умолчанию по Applet
, который является FlowLayout
.JApplet
объект. См. Выполняющее Пользовательское Рисование для примеров того, как выполнить пользовательское рисование в апплетах.Компоненты Swing должны быть созданы, запрошены, и управляться на диспетчеризирующем событие потоке, но браузеры не вызывают методы "вехи" апплета от того потока. Поэтому методы вехи — init
, start
, stop
, и destroy
— должен использовать SwingUtilities
метод invokeAndWait
(или, если приспособлено, invokeLater
) так, чтобы код, который обращается к компонентам Swing, был выполнен на диспетчеризирующем событие потоке. Больше информации об этих методах и диспетчеризирующем событие потоке находится в Параллелизме в Swing.
Вот пример init
метод:
public void init() { //Execute a job on the event-dispatching thread: //creating this applet's GUI. try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } } private void createGUI() { JLabel label = new JLabel( "You are successfully running a Swing applet!"); label.setHorizontalAlignment(JLabel.CENTER); label.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black)); getContentPane().add(label, BorderLayout.CENTER); }
invokeLater
метод не является подходящим для этой реализации, потому что это позволяет init
чтобы возвратиться перед, инициализация полна, который может вызвать проблемы апплета, которые трудно отладить.
init
метод в TumbleItem
более сложно, как следующие шоу кода. Как первый пример, это init
использование реализации метода SwingUtilities.invokeAndWait
выполнить код создания GUI диспетчеризирующего событие потока. Это init
метод устанавливает таймер Swing, чтобы запустить события действия обновление анимация. Кроме того, init
использование javax.swing.SwingWorker
создать фоновую задачу, которая загружает файлы изображений анимации, позволяя апплету представить GUI сразу же, не ожидая всех ресурсов, которые будут загружены.
private void createGUI() { ... animator = new Animator(); animator.setOpaque(true); animator.setBackground(Color.white); setContentPane(animator); ... } public void init() { loadAppletParameters(); //Execute a job on the event-dispatching thread: //creating this applet's GUI. try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } //Set up the timer that will perform the animation. timer = new javax.swing.Timer(speed, this); timer.setInitialDelay(pause); timer.setCoalesce(false); timer.start(); //Start the animation. //Background task for loading images. SwingWorker worker = (new SwingWorker<ImageIcon[], Object>() { public ImageIcon[] doInBackground() { final ImageIcon[] innerImgs = new ImageIcon[nimgs]; ...//Load all the images... return imgs; } public void done() { //Remove the "Loading images" label. animator.removeAll(); loopslot = -1; try { imgs = get(); } ...//Handle possible exceptions } }).execute(); }
Можно найти исходный код апплета в TumbleItem.java
. Чтобы счесть все файлы требуемыми для апплета, см., что пример индексирует.
Applet
class обеспечивает getImage
метод для того, чтобы загрузить изображения в апплет. getImage
метод создает и возвращается Image
объект, который представляет загруженное изображение. Поскольку компоненты Swing используют Icon
s, а не Image
s, чтобы обратиться к изображениям, апплеты Swing имеют тенденцию не использовать getImage
. Вместо этого апплеты Swing создают экземпляры ImageIcon
— значок загружался от файла изображения. ImageIcon
идет с сохраняющим код преимуществом: это обрабатывает изображение, отслеживающее автоматически. Обратитесь к тому, Как Использовать Значки для получения дополнительной информации.
Анимация Герцога, делающего колеса телеги, требует 17 различных изображений. Апплет использует тот ImageIcon
на изображение и загружает их в init
метод. Поскольку изображения могут занять много времени, чтобы загрузиться, значки загружаются в отдельном потоке, реализованном a SwingWorker
объект. Вот код:
public void init() { ... imgs = new ImageIcon[nimgs]; (new SwingWorker<ImageIcon[], Object>() { public ImageIcon[] doInBackground() { //Images are numbered 1 to nimgs, //but fill array from 0 to nimgs-1. for (int i = 0; i < nimgs; i++) { imgs[i] = loadImage(i+1); } return imgs; } ... }).execute(); } ... protected ImageIcon loadImage(int imageNum) { String path = dir + "/T" + imageNum + ".gif"; int MAX_IMAGE_SIZE = 2400; //Change this to the size of //your biggest image, in bytes. int count = 0; BufferedInputStream imgStream = new BufferedInputStream( this.getClass().getResourceAsStream(path)); if (imgStream != null) { byte buf[] = new byte[MAX_IMAGE_SIZE]; try { count = imgStream.read(buf); imgStream.close(); } catch (java.io.IOException ioe) { System.err.println("Couldn't read stream from file: " + path); return null; } if (count <= 0) { System.err.println("Empty file: " + path); return null; } return new ImageIcon(Toolkit.getDefaultToolkit().createImage(buf)); } else { System.err.println("Couldn't find file: " + path); return null; } }
loadImage
метод загружает изображение для указанного фрейма анимации. Это использует getResourceAsStream
метод, а не обычное getResource
метод, чтобы получить изображения. Получающийся код не симпатичен, но getResourceAsStream
более эффективно чем getResource
для того, чтобы загрузить изображения из файлов JAR в апплеты, которые выполняются, используя Java программное обеспечение Plug-in™. Для получения дальнейшей информации см. Загружающиеся Изображения В Апплеты.
Можно развернуть простой апплет при использовании applet
тег. Вот applet
тег для катящегося кувырком апплета Герцога:
<applet code="TumbleItem.class" codebase="examples/" archive="tumbleClasses.jar, tumbleImages.jar" width="600" height="95"> <param name="maxwidth" value="120"> <param name="nimgs" value="17"> <param name="offset" value="-57"> <param name="img" value="images/tumble"> Your browser is completely ignoring the <applet> tag! </applet>
Чтобы развернуть более сложные апплеты, которые будут работать легко в многократных средах, см. Развертывание Апплета в уроке Апплетов Java.
Следующая таблица приводит интересные методы это JApplet
добавляет к API апплета. Они дают Вам, доступ к функциям, обеспеченным полностью, разделяет на области. Другие методы, которые Вы могли бы использовать, определяются Component
и Applet
Component
методы, и Applet
методы.
Метод | Цель |
---|---|
освободите setContentPane (Контейнер) |
Набор или получает область контента апплета. Область контента содержит видимые компоненты GUI апплета и должна быть непрозрачной. |
|
Создайте, установите, или получите корневую область апплета. Корневая область управляет внутренней частью апплета включая область контента, стеклянную область, и так далее. |
|
Набор или заставляет строку меню апплета управлять рядом меню для апплета. |
|
Набор или получает стеклянную область апплета. Можно использовать стеклянную область, чтобы прервать события от нажатия мыши. |
|
Набор или получает многоуровневую область апплета. Можно использовать многоуровневую область апплета, чтобы поместить компоненты сверху или позади других компонентов. |
Эта таблица показывает примеры апплетов Swing и где те примеры описываются.
Пример | Где Описано | Примечания |
---|---|---|
TumbleItem |
Эта страница | Апплет анимации |