📄 0063.htm
字号:
</blockquote>
<p> ev.arg属性传递了来自被单击按钮的标签,并把它与所按的按钮的标签进行比较。</p>
<p> 试验一下别的按钮,把它们添加到BorderLayout的south、east和west处,看看效果如何。</p>
<h3><font color="#006633" mstheme>面板(Panel)</font mstheme></h3>
<p> 从前面的程序中我们注意到两件事情: </p>
<table border="0" cellpadding="0" cellspacing="0" width="100%" msimagelist>
<tr msimagelist>
<td valign="baseline" width="42" msimagelist><img src="../images/anabull2.gif" tppabs="http://www.nease.net/~zhangsh/images/anabull2.gif" width="12" height="12" hspace="15"></td>
<td valign="top" width="100%">你在BorderLayout的五个位置的每个位置只能放置一个控制。</td msimagelist>
</tr>
<tr msimagelist>
<td valign="baseline" width="42" msimagelist><img src="../images/anabull2.gif" tppabs="http://www.nease.net/~zhangsh/images/anabull2.gif" width="12" height="12" hspace="15"></td>
<td valign="top" width="100%">如果你在BorderLayout的外边界放置按钮,则它不会是一个单独的“整体”。即,绘制到applet区域上的“欢迎来到Java世界”字符串和按钮只有一部分。所以应该注意绘制的位置。</td msimagelist>
</tr>
</table msimagelist>
<p> 为了解决上面两个问题,你可以使用“面板”(或在绘图区域的情况下你可以使用“Canvas”)。特别地,面板更适用于把一组控制的情况。它按行的方式来组织它们。如果面板上的空间有限,该行会根据需要进行“换行”。</p>
<blockquote>
<pre>// SimpleUI.java
import java.awt.*;
import java.applet.*;
class PanelGraph extends Panel
{
int x = 10;
public void paint(Graphics g)
{
for (int y = 0 ; y < size().height ; y+=15)
{
g.drawString("欢迎来到Java世界!", x, y);
}
}
public void changeX()
{
x += 10;
repaint();
}
}
class PanelUI extends Panel
{
Choice c;
PanelGraph pg;
public PanelUI(PanelGraph pgIn)
{
add(new Button("应用"));
add(new Label("Test Colors", Label.RIGHT));
add(c = new Choice());
c.addItem("红色");
c.addItem("绿色");
c.addItem("蓝色");
pg = pgIn;
}
public boolean action(Event ev, Object arg)
{
if (ev.target instanceof Button)
{
pg.changeX();
return true;
}
return false;
}
}
public class SimpleUI extends Applet
{
PanelGraph pg;
PanelUI pui;
public SimpleUI()
{
setLayout(new BorderLayout());
pg = new PanelGraph();
add("Center", pg);
Panel p = new PanelUI(pg);
add("North", p);
}
}</pre>
</blockquote>
<p> 在该程序中,有两个扩展了面板的新类。在PanelGraph中,面板是作为类绘制“欢迎来到Java世界”的区域。该类有一个与前面已经见过的相同的paint方法,同时其它类可以使用changeX方法来移动“欢迎来到Java世界”。</p>
<p> PanelUI类也扩展了面板。该类的构造函数向面板添加了三个控制:一个按钮、一个标签和一个选择列表(它在程序运行时会表现出色,但现在不会做任何事情)。该面板也会识别按钮单击和响应在PanelGraph中对changeX方法的调用。</p>
<p> 该applet类简单地建立了两个面板并把它们添加到布局中。其它工作由面板去做。还有另外一种可供选择的方法,让applet去响应按钮事件并在那里调用PanelGraph的changeX方法。你可以决定使用对你来说更方便。</p>
<p> 编译并运行该程序。你会发现north的面板包含三个用户界面控制,窗口其余部分为图形面板所填充。如果你单击按钮欢迎来到Java世界文本会移动。</p>
<p>
为了完成该程序,我们需要能够根据用户所选择的颜色来改变PanelGraph中的颜色。为此,修改PanelGraph如下所示:</p>
<blockquote>
<pre>class PanelGraph extends Panel
{
int x = 10;
Color c = Color.red;
public void paint(Graphics g)
{
g.setColor(c);
for (int y = 0 ; y < size().height ; y+=15)
{
g.drawString("欢迎来到Java世界!", x, y);
}
}
public void changeX()
{
x += 10;
repaint();
}
public void changeColor(Color cin)
{
c = cin;
repaint();
}
}</pre>
</blockquote>
<p> 然后改变PanelUI事件处理函数以使它如下所示:</p>
<blockquote>
<pre>public boolean action(Event ev, Object arg)
{
if (ev.target instanceof Button)
{
if ("红色".equals(c.getSelectedItem()))
pg.changeColor(Color.red);
if ("绿色".equals(c.getSelectedItem()))
pg.changeColor(Color.green);
if ("蓝色".equals(c.getSelectedItem()))
pg.changeColor(Color.blue);
return true;
}
return false;
}</pre>
</blockquote>
<p> 编译并运行该程序。你会看到,你可以从颜色列表中选择一种颜色,然后单击“应用”按钮来改变图形面板中颜色。事件处理函数使用Choice控制的getSelectedItem方法来获取用户的选择,然后它调用PanelGraph中的changeColor来改变颜色。</p>
<h3><font color="#006633" mstheme><strong>Applet的参数</strong></font mstheme></h3>
<p> 在很多情况下,你可能要在applet启动时通过向applet传递参数来定制它。幸运的是,这很容易实现。在HTML中,你可以在调用applet时向其传递任何多的参数。例如,你可以改变HTML文件如下:</p>
<blockquote>
<pre><title>欢迎来到Java世界 Demo</title>
<hr>
<applet code=Hello.class width=300 height=120>
<param name=rows value="4">
</applet>
<hr></pre>
</blockquote>
<p> 该参数可以是你喜欢的任何名字。在applet中,你可以使用Applet类中的getParameter方法来获取该参数:</p>
<blockquote>
<pre>String r = getParameter("rows");</pre>
</blockquote>
<p> 如果该参数没有名字,则getParameter返回null,你可以测试如下:</p>
<blockquote>
<pre>if (r == null)
{
r = 10; // default value
}
else
{
r = Integer.parseInt(rs);
}</pre>
</blockquote>
<h3><font color="#006633" mstheme><strong>图像与动画</strong></font mstheme></h3>
<p> Java是多线程的。Java也使得使用位图(即图像)变得很容易。你可以结合这两者来建立动画。下面的代码实现了一个很简单的动画。它把位图从上面滑下:</p>
<blockquote>
<pre>import java.awt.*;
import java.applet.*;
public class Logo extends Applet implements Runnable
{
Image img;
Thread thd = null;
int i;
int imgWidth = 359;
int imgHeight = 121;
public void run()
{
img = getImage(getCodeBase(), "test.jpg");
if (img != null)
{
i=imgHeight;
repaint();
while (true)
{
try {Thread.sleep(1000);} catch (InterruptedException e){}
i=0;
while (i<imgHeight)
{
repaint();
try {Thread.sleep(50);} catch (InterruptedException e){}
i+=4;
}
}
}
}
public void update(Graphics g)
{
if (img != null)
{
g.clipRect(0, 0, imgWidth, i);
g.drawImage(img, 0, i - imgHeight, null);
}
}
public void start()
{
if (thd == null)
{
thd = new Thread(this);
thd.start();
}
}
public void stop()
{
thd = null;
}
}</pre>
</blockquote>
<p> 为了理解该代码,你可以先看一下Java文档中的the thread class。run方法表示了一个新的线程。在该单独的线程中,代码装入一幅图像,然后通过在循环过程中每隔50毫秒在新位置重画它来实现动画。然后代码等待一秒钟,重复动画。</p>
<p> 每次代码在新位置处重画位图,它都要调用repaint。该函数调用可重载的update方法。update方法与paint方法是相同的,除了paint方法在绘图前要清除窗口,而update方法不清除(如果你把update方法改名为paint,你会看到有什么不同)。此处,update方法次简单地在由i指定的位置处绘制图像。</p>
<p> 如果你要制作一组15帧组成的动画,你会看到你所要做的只是把这15帧图像装到一个图像数组中,然后用update方法按顺序绘制它们。是不是很简单。</p>
<p align="right"><font color="#0000FF"><small>© <em>1997 <a href="../../www.iftech.com/default.htm" tppabs="http://www.iftech.com/" target="_blank">Interface Technologies, Inc</a></em></small> </font></p>
</table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -