The Java Tutorials have been written for JDK 8.Java教程是为JDK 8编写的。Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available.本页中描述的示例和实践没有利用后续版本中引入的改进,并且可能使用不再可用的技术。See Java Language Changes for a summary of updated language features in Java SE 9 and subsequent releases.有关Java SE 9及其后续版本中更新的语言特性的摘要,请参阅Java语言更改。
See JDK Release Notes for information about new features, enhancements, and removed or deprecated options for all JDK releases.有关所有JDK版本的新功能、增强功能以及已删除或不推荐的选项的信息,请参阅JDK发行说明。
This section covers 本节涵盖JApplet
a class that enables applets to use Swing components. JApplet
使小应用程序能够使用Swing组件的类。JApplet
is a subclass of 是java.applet.Applet
, which is covered in the Java Applets trail. java.applet.Applet
的一个子类,在Java小程序教程中有介绍。If you've never written a regular applet before, we urge you to read that trail before proceeding with this section. 如果您以前从未编写过常规的小程序,我们建议您在继续本节之前阅读该教程。The information provided in that trail applies to Swing applets, with a few exceptions that this section explains.该指南中提供的信息适用于Swing小程序,本节将解释一些例外情况。
Any applet that contains Swing components must be implemented with a subclass of 任何包含Swing组件的applet都必须用JApplet
. JApplet
的子类实现。Here's a Swing version of one of the applets that helped make Java famous an animation applet that (in its most well known configuration) shows our mascot Duke doing cartwheels:以下是帮助Java成名的小程序之一的Swing版本一个动画小程序(在其最著名的配置中)显示吉祥物杜克正在做侧翻:
You can find the main source code for this applet in 您可以在TumbleItem.java
.TumbleItem.java
中找到此小程序的主要源代码。
This section discusses the following topics:本节讨论以下主题:
Because 因为JApplet
is a top-level Swing container, each Swing applet has a root pane. JApplet
是一个顶级Swing容器,所以每个Swing小程序都有一个根窗格。The most noticeable effects of the root pane's presence are support for adding a menu bar and the need to use a content pane.根窗格的存在最显著的影响是支持添加菜单栏和需要使用内容窗格。
As described in Using Top-Level Containers, each top-level container such as a 如使用顶级容器中所述,每个顶级容器(如JApplet)都有一个内容窗格。JApplet
has a single content pane. The content pane makes Swing applets different from regular applets in the following ways:内容窗格通过以下方式使Swing小程序与常规小程序不同:
BorderLayout
. BorderLayout
。Applet
, which is FlowLayout
.Applet
的默认布局管理器,即FlowLayout
。JApplet
object. JApplet
对象中。Swing components should be created, queried, and manipulated on the event-dispatching thread, but browsers don't invoke applet "milestone" methods from that thread. Swing组件应该在事件调度线程上创建、查询和操作,但浏览器不会从该线程调用applet“里程碑”方法。For this reason, the milestone methods 因此,里程碑方法init
, start
, stop
, and destroy
should use the SwingUtilities
method invokeAndWait
(or, if appropriate, invokeLater
) so that code that refers to the Swing components is executed on the event-dispatching thread. init
、start
、stop
和destory
;应使用SwingUtilities
方法invokeAndWait
(或者,如果合适,使用invokeLater
),以便在事件调度线程上执行引用Swing组件的代码。More information about these methods and the event-dispatching thread is in Concurrency in Swing.有关这些方法和Swing中并发的事件调度线程的更多信息。
Here is an example of an 以下是init
method: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); }
The invokeLater
method is not appropriate for this implementation because it allows init
to return before initialization is complete, which can cause applet problems that are difficult to debug.invokeLater
方法不适用于此实现,因为它允许init
在初始化完成之前返回,这可能会导致难以调试的小程序问题。
The init
method in TumbleItem
is more complex, as the following code shows. TumbleItem
中的init
方法更复杂,如下代码所示。Like the first example, this 与第一个示例类似,此init
method implementation uses SwingUtilities.invokeAndWait
to execute the GUI creation code on the event-dispatching thread. init
方法实现使用SwingUtilities.invokeAndWait
在事件调度线程上执行GUI创建代码。This 这个init
method sets up a Swing timer to fire action events the update the animation. init
方法设置了一个Swing定时器来触发动作事件以更新动画。Also, 此外,init
uses javax.swing.SwingWorker
to create a background task that loads the animation image files, letting the applet present a GUI right away, without waiting for all resources to be loaded.init
使用javax.swing.SwingWorker
创建一个加载动画图像文件的后台任务,让applet立即呈现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(); }
You can find the applet's source code in 您可以在TumbleItem.java
. TumbleItem.java
中找到小程序的源代码。To find all the files required for the applet, see the example index.要查找小程序所需的所有文件,请参阅示例索引。
The Applet
class provides the getImage
method for loading images into an applet. Applet
类提供了用于将图像加载到Applet中的getImage
方法。The getImage
method creates and returns an Image
object that represents the loaded image. getImage
方法创建并返回表示加载图像的Image
对象。Because Swing components use 因为Swing组件使用Icon
s rather than Image
s to refer to pictures, Swing applets tend not to use getImage
. Icon
而不是Image
来引用图片,所以Swing小程序倾向于不使用getImage
。Instead Swing applets create instances of 相反,Swing小程序创建ImageIcon
an icon loaded from an image file. ImageIcon
从图像文件加载的图标。ImageIcon
comes with a code-saving benefit: it handles image tracking automatically. 附带一个节省代码的好处:它可以自动处理图像跟踪。Refer to How to Use Icons for more information.有关更多信息,请参阅如何使用图标。
The animation of Duke doing cartwheels requires 17 different pictures. 杜克做车轮的动画需要17张不同的图片。The applet uses one 小程序在每张图片上使用一个ImageIcon
per picture and loads them in its init
method. ImageIcon
,并在其init
方法中加载它们。Because images can take a long time to load, the icons are loaded in a separate thread implemented by a 由于图像可能需要很长时间才能加载,因此图标将加载到由SwingWorker
object. SwingWorker
对象实现的单独线程中。Here's the code:下面是代码:
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; } }
The loadImage
method loads the image for the specified frame of animation. loadImage
方法为指定的动画帧加载图像。It uses the 它使用getResourceAsStream
method rather than the usual getResource
method to get the images. getResourceAsStream
方法而不是通常的getResource
方法来获取图像。The resulting code isn't pretty, but 生成的代码并不漂亮,但是对于将JAR文件中的图像加载到使用Java插件™软件执行的小程序,getResourceAsStream
is more efficient than getResource
for loading images from JAR files into applets that are executed using Java Plug-in™ software. getResourceAsStream
比getResource
更高效。For further details, see Loading Images Into Applets.有关详细信息,请参阅将图像加载到小程序中。
You can deploy a simple applet by using the 您可以使用applet标记部署一个简单的applet
tag. applet
。Or, you can use the Deployment Toolkit. 或者,您可以使用部署工具包。Here is the code for the cartwheeling Duke applet:下面是Cartweeling Duke小程序的代码:
<script src="https://www.java.com/js/deployJava.js" type="text/javascript"> </script><script type="text/javascript"> //<![CDATA[ var attributes = { archive: 'https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TumbleItemProject/TumbleItem.jar', codebase: 'https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TumbleItemProject', code:'components.TumbleItem', width:'600', height:'95' }; var parameters = { permissions:'sandbox', nimgs:'17', offset:'-57', img: 'images/tumble', maxwidth:'120' }; deployJava.runApplet(attributes, parameters, '1.7'); //]]> </script><noscript>A browser with Javascript enabled is required for this page to operate properly.</noscript>
For more information, see Deploying an Applet in the Java Applets lesson.有关详细信息,请参阅Java小程序课程中的部署小程序。
The next table lists the interesting methods that 下表列出了JApplet
adds to the applet API. JApplet
添加到applet API中的有趣方法。They give you access to features provided by the root pane. 它们允许您访问根窗格提供的功能。Other methods you might use are defined by the 您可能使用的其他由Component
and Applet
classes. Component
和Applet
类定义的方法。See Component Methods for a list of commonly used 有关常用Component
methods, and Java Applets for help in using Applet
methods.Component
方法的列表,请参阅组件方法;有关使用Applet
方法的帮助,请参阅Java小程序。
void setContentPane(Container)
Container getContentPane()
|
|
void setRootPane(JRootPane) JRootPane getRootPane() |
|
void setJMenuBar(JMenuBar) JMenuBar getJMenuBar() |
|
void setGlassPane(Component) Component getGlassPane() |
|
void setLayeredPane(JLayeredPane) JLayeredPane getLayeredPane() |
This table shows examples of Swing applets and where those examples are described.下表显示了Swing小程序的示例以及这些示例的描述位置。
TumbleItem |