⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0063.htm

📁 关于java的开发文档
💻 HTM
📖 第 1 页 / 共 2 页
字号:
</blockquote>

<p>&nbsp;&nbsp;&nbsp; ev.arg属性传递了来自被单击按钮的标签,并把它与所按的按钮的标签进行比较。</p>

<p>&nbsp;&nbsp;&nbsp; 试验一下别的按钮,把它们添加到BorderLayout的south、east和west处,看看效果如何。</p>

<h3><font color="#006633" mstheme>面板(Panel)</font mstheme></h3>

<p>&nbsp;&nbsp;&nbsp; 从前面的程序中我们注意到两件事情: </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>&nbsp;&nbsp;&nbsp; 为了解决上面两个问题,你可以使用“面板”(或在绘图区域的情况下你可以使用“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 &lt; size().height ; y+=15) 
      {
            g.drawString(&quot;欢迎来到Java世界!&quot;, x, y);
      }
   }
   public void changeX()
   {
      x += 10;
      repaint();
   }
}

class PanelUI extends Panel
{
   Choice c;
   PanelGraph pg;

   public PanelUI(PanelGraph pgIn)
   {
      add(new Button(&quot;应用&quot;));
      add(new Label(&quot;Test Colors&quot;, Label.RIGHT));

      add(c = new Choice());
      c.addItem(&quot;红色&quot;);
      c.addItem(&quot;绿色&quot;);
      c.addItem(&quot;蓝色&quot;);
      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(&quot;Center&quot;, pg);

      Panel p = new PanelUI(pg);
      add(&quot;North&quot;, p);
   }
}</pre>
</blockquote>

<p>&nbsp;&nbsp;&nbsp; 在该程序中,有两个扩展了面板的新类。在PanelGraph中,面板是作为类绘制“欢迎来到Java世界”的区域。该类有一个与前面已经见过的相同的paint方法,同时其它类可以使用changeX方法来移动“欢迎来到Java世界”。</p>

<p>&nbsp;&nbsp;&nbsp; PanelUI类也扩展了面板。该类的构造函数向面板添加了三个控制:一个按钮、一个标签和一个选择列表(它在程序运行时会表现出色,但现在不会做任何事情)。该面板也会识别按钮单击和响应在PanelGraph中对changeX方法的调用。</p>

<p>&nbsp;&nbsp;&nbsp; 该applet类简单地建立了两个面板并把它们添加到布局中。其它工作由面板去做。还有另外一种可供选择的方法,让applet去响应按钮事件并在那里调用PanelGraph的changeX方法。你可以决定使用对你来说更方便。</p>

<p>&nbsp;&nbsp;&nbsp; 编译并运行该程序。你会发现north的面板包含三个用户界面控制,窗口其余部分为图形面板所填充。如果你单击按钮欢迎来到Java世界文本会移动。</p>

<p>&nbsp;&nbsp;&nbsp; 
为了完成该程序,我们需要能够根据用户所选择的颜色来改变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 &lt; size().height ; y+=15) 
      {
            g.drawString(&quot;欢迎来到Java世界!&quot;, x, y);
      }
   }
   public void changeX()
   {
      x += 10;
      repaint();
   }
   public void changeColor(Color cin)
   {
      c = cin;
      repaint();
   }
}</pre>
</blockquote>

<p>&nbsp;&nbsp;&nbsp; 然后改变PanelUI事件处理函数以使它如下所示:</p>

<blockquote>
  <pre>public boolean action(Event ev, Object arg) 
{
   if (ev.target instanceof Button) 
   {
      if (&quot;红色&quot;.equals(c.getSelectedItem()))
         pg.changeColor(Color.red);            
      if (&quot;绿色&quot;.equals(c.getSelectedItem()))
         pg.changeColor(Color.green);            
      if (&quot;蓝色&quot;.equals(c.getSelectedItem()))
         pg.changeColor(Color.blue);            
      return true;
   }
   return false;
}</pre>
</blockquote>

<p>&nbsp;&nbsp;&nbsp; 编译并运行该程序。你会看到,你可以从颜色列表中选择一种颜色,然后单击“应用”按钮来改变图形面板中颜色。事件处理函数使用Choice控制的getSelectedItem方法来获取用户的选择,然后它调用PanelGraph中的changeColor来改变颜色。</p>

<h3><font color="#006633" mstheme><strong>Applet的参数</strong></font mstheme></h3>

<p>&nbsp;&nbsp;&nbsp; 在很多情况下,你可能要在applet启动时通过向applet传递参数来定制它。幸运的是,这很容易实现。在HTML中,你可以在调用applet时向其传递任何多的参数。例如,你可以改变HTML文件如下:</p>

<blockquote>
  <pre>&lt;title&gt;欢迎来到Java世界 Demo&lt;/title&gt;
&lt;hr&gt;
&lt;applet code=Hello.class width=300 height=120&gt;
&lt;param name=rows value=&quot;4&quot;&gt;
&lt;/applet&gt;
&lt;hr&gt;</pre>
</blockquote>

<p>&nbsp;&nbsp;&nbsp; 该参数可以是你喜欢的任何名字。在applet中,你可以使用Applet类中的getParameter方法来获取该参数:</p>

<blockquote>
  <pre>String r = getParameter(&quot;rows&quot;);</pre>
</blockquote>

<p>&nbsp;&nbsp;&nbsp; 如果该参数没有名字,则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>&nbsp;&nbsp;&nbsp; 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(), &quot;test.jpg&quot;);
        if (img != null) 
        {
            i=imgHeight;
            repaint();
            while (true) 
            {
                try {Thread.sleep(1000);} catch (InterruptedException e){}
                i=0;
                while (i&lt;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>&nbsp;&nbsp;&nbsp; 为了理解该代码,你可以先看一下Java文档中的the thread class。run方法表示了一个新的线程。在该单独的线程中,代码装入一幅图像,然后通过在循环过程中每隔50毫秒在新位置重画它来实现动画。然后代码等待一秒钟,重复动画。</p>

<p>&nbsp;&nbsp;&nbsp; 每次代码在新位置处重画位图,它都要调用repaint。该函数调用可重载的update方法。update方法与paint方法是相同的,除了paint方法在绘图前要清除窗口,而update方法不清除(如果你把update方法改名为paint,你会看到有什么不同)。此处,update方法次简单地在由i指定的位置处绘制图像。</p>

<p>&nbsp;&nbsp;&nbsp; 如果你要制作一组15帧组成的动画,你会看到你所要做的只是把这15帧图像装到一个图像数组中,然后用update方法按顺序绘制它们。是不是很简单。</p>

<p align="right"><font color="#0000FF"><small>&copy; <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 + -