|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел покрытия JApplet — class, который позволяет апплетам использовать компоненты Swing. JApplet подкласс java.applet.Applet, который покрывается следом
Любой апплет, который содержит компоненты Swing, должен быть реализован с подклассом JApplet. Вот версия Swing одного из апплетов, которые помогли сделать 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();
}
Можно найти исходный код апплета в
Applet class обеспечивает getImage метод для того, чтобы загрузить изображения в апплет. getImage метод создает и возвращается Image объект, который представляет загруженное изображение. Поскольку компоненты Swing используют Icons, а не Images, чтобы обратиться к изображениям, апплеты 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 и классы. См. Компонентные Методы для списка обычно используемого Component методы, и
| Метод | Цель |
|---|---|
|
освободите setContentPane (Контейнер) |
Набор или получает область контента апплета. Область контента содержит видимые компоненты GUI апплета и должна быть непрозрачной. |
|
|
Создайте, установите, или получите корневую область апплета. Корневая область управляет внутренней частью апплета включая область контента, стеклянную область, и так далее. |
|
|
Набор или заставляет строку меню апплета управлять рядом меню для апплета. |
|
|
Набор или получает стеклянную область апплета. Можно использовать стеклянную область, чтобы прервать события от нажатия мыши. |
|
|
Набор или получает многоуровневую область апплета. Можно использовать многоуровневую область апплета, чтобы поместить компоненты сверху или позади других компонентов. |
Эта таблица показывает примеры апплетов Swing и где те примеры описываются.
| Пример | Где Описано | Примечания |
|---|---|---|
TumbleItem |
Эта страница | Апплет анимации |