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

📄 tij0147.html

📁 学习java的经典书籍
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<html><body>

<table width="100%"><tr>
<td>
<a href="http://www.bruceeckel.com/javabook.html">Bruce Eckel's Thinking in Java</a>
</td>
<td align="right">
<a href="tij_c.html">Contents</a> | <a href="tij0146.html">Prev</a> | <a href="tij0148.html">Next</a>
</td>
</tr></table>
<hr>

<H2 ALIGN=LEFT>
Windowed
applications
<P><A NAME="Index1759"></A><A NAME="Index1760"></A><A NAME="Index1761"></A></H2>
<DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">It&#8217;s
possible to see that for safety&#8217;s sake you can have only limited behavior
within an applet. In a real sense, the applet is a temporary extension to the
Web browser so its functionality must be limited along with its knowledge and
control. There are times, however, when you&#8217;d like to make a windowed
program do something else than sit on a Web page, and perhaps you&#8217;d like
it to do some of the things a &#8220;regular&#8221; application can do and yet
have the vaunted instant portability provided by Java. In previous chapters in
this book we&#8217;ve made command-line applications, but in some operating
environments (the Macintosh, for example) there isn&#8217;t a command line. So
for any number of reasons you&#8217;d like to build a windowed, non-applet
program using Java. This is certainly a reasonable desire.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">A
Java windowed application can have menus and dialog boxes (impossible or
difficult with an applet), and yet if you&#8217;re using an older version of
Java you sacrifice the native operating environment&#8217;s look and feel. The
JFC/Swing library allows you to make an application that preserves the look and
feel of the underlying operating environment. If you want to build windowed
applications, it makes sense to do so only if you can use the latest version of
Java and associated tools so you can deliver applications that won&#8217;t
confound your users. If for some reason you&#8217;re forced to use an older
version of Java, think hard before committing to building a significant
windowed application.
</FONT><a name="_Toc375545467"></a><a name="_Toc408018703"></a><P></DIV>
<A NAME="Heading420"></A><H3 ALIGN=LEFT>
Menus<P><A NAME="Index1762"></A></H3>
<DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">It&#8217;s
impossible to put a menu directly on an applet (in Java 1.0 and Java 1.1; the
Swing library 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><I>does
</I></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">allow
it), so they&#8217;re for applications. Go ahead, try it if you don&#8217;t
believe me and you&#8217;re sure that it would make sense to have menus on
applets. There&#8217;s no <A NAME="Index1763"></A><A NAME="Index1764"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>setMenuBar(&#160;)</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
method in 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Applet</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
and that&#8217;s the way a menu is attached. (You&#8217;ll see later that
it&#8217;s possible to spawn a 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Frame</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
from within an 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Applet</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
and the 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Frame</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
can contain menus.)
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">There
are four different types of <A NAME="Index1765"></A><A NAME="Index1766"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>MenuComponent</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
all derived from that abstract class: <A NAME="Index1767"></A><A NAME="Index1768"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>MenuBar</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
(you can have one 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>MenuBar</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
only on a particular <A NAME="Index1769"></A><A NAME="Index1770"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Frame</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">),
<A NAME="Index1771"></A><A NAME="Index1772"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Menu</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
to hold one individual drop-down menu or submenu, <A NAME="Index1773"></A><A NAME="Index1774"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>MenuItem</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
to represent one single element on a menu, and <A NAME="Index1775"></A><A NAME="Index1776"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>CheckboxMenuItem,</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
which is derived from 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>MenuItem</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
and produces a checkmark to indicate whether that menu item is selected.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">Unlike
a system that uses resources, with Java and the AWT you must hand assemble all
the menus in source code. Here are the ice cream flavors again, used to create
menus:
</FONT><P></DIV>

<font color="#990000"><PRE><font color="#009900">//: Menu1.java</font>
<font color="#009900">// Menus work only with Frames.</font>
<font color="#009900">// Shows submenus, checkbox menu items</font>
<font color="#009900">// and swapping menus.</font>
<font color="#0000ff">import</font> java.awt.*;

<font color="#0000ff">public</font> <font color="#0000ff">class</font> Menu1 <font color="#0000ff">extends</font> Frame {
  String[] flavors = { "Chocolate", "Strawberry",
    "Vanilla Fudge Swirl", "Mint Chip", 
    "Mocha Almond Fudge", "Rum Raisin", 
    "Praline Cream", "Mud Pie" };
  TextField t = <font color="#0000ff">new</font> TextField("No flavor", 30);
  MenuBar mb1 = <font color="#0000ff">new</font> MenuBar();
  Menu f = <font color="#0000ff">new</font> Menu("File");
  Menu m = <font color="#0000ff">new</font> Menu("Flavors");
  Menu s = <font color="#0000ff">new</font> Menu("Safety");
  <font color="#009900">// Alternative approach:</font>
  CheckboxMenuItem[] safety = {
    <font color="#0000ff">new</font> CheckboxMenuItem("Guard"),
    <font color="#0000ff">new</font> CheckboxMenuItem("Hide")
  };
  MenuItem[] file = {
    <font color="#0000ff">new</font> MenuItem("Open"),
    <font color="#0000ff">new</font> MenuItem("Exit")
  };
  <font color="#009900">// A second menu bar to swap to:</font>
  MenuBar mb2 = <font color="#0000ff">new</font> MenuBar();
  Menu fooBar = <font color="#0000ff">new</font> Menu("fooBar");
  MenuItem[] other = {
    <font color="#0000ff">new</font> MenuItem("Foo"),
    <font color="#0000ff">new</font> MenuItem("Bar"),
    <font color="#0000ff">new</font> MenuItem("Baz"),
  };
  Button b = <font color="#0000ff">new</font> Button("Swap Menus");
  <font color="#0000ff">public</font> Menu1() {
    <font color="#0000ff">for</font>(<font color="#0000ff">int</font> i = 0; i &lt; flavors.length; i++) {
      m.add(<font color="#0000ff">new</font> MenuItem(flavors[i]));
      <font color="#009900">// Add separators at intervals:</font>
      <font color="#0000ff">if</font>((i+1) % 3 == 0) 
        m.addSeparator();
    }
    <font color="#0000ff">for</font>(<font color="#0000ff">int</font> i = 0; i &lt; safety.length; i++)
      s.add(safety[i]);
    f.add(s);
    <font color="#0000ff">for</font>(<font color="#0000ff">int</font> i = 0; i &lt; file.length; i++)
      f.add(file[i]);
    mb1.add(f);
    mb1.add(m);
    setMenuBar(mb1);
    t.setEditable(<font color="#0000ff">false</font>);
    add("Center", t);
    <font color="#009900">// Set up the system for swapping menus:</font>
    add("North", b);
    <font color="#0000ff">for</font>(<font color="#0000ff">int</font> i = 0; i &lt; other.length; i++)
      fooBar.add(other[i]);
    mb2.add(fooBar);
  }
  <font color="#0000ff">public</font> <font color="#0000ff">boolean</font> handleEvent(Event evt) {
    <font color="#0000ff">if</font>(evt.id == Event.WINDOW_DESTROY) 
      System.exit(0);
    <font color="#0000ff">else</font> 
      <font color="#0000ff">return</font> <font color="#0000ff">super</font>.handleEvent(evt);
    <font color="#0000ff">return</font> <font color="#0000ff">true</font>;
  }
  <font color="#0000ff">public</font> <font color="#0000ff">boolean</font> action(Event evt, Object arg) {
    <font color="#0000ff">if</font>(evt.target.equals(b)) {
      MenuBar m = getMenuBar();
      <font color="#0000ff">if</font>(m == mb1) setMenuBar(mb2);
      <font color="#0000ff">else</font> <font color="#0000ff">if</font> (m == mb2) setMenuBar(mb1);
    } 
    <font color="#0000ff">else</font> <font color="#0000ff">if</font>(evt.target <font color="#0000ff">instanceof</font> MenuItem) {
      <font color="#0000ff">if</font>(arg.equals("Open")) {
        String s = t.getText();
        <font color="#0000ff">boolean</font> chosen = <font color="#0000ff">false</font>;
        <font color="#0000ff">for</font>(<font color="#0000ff">int</font> i = 0; i &lt; flavors.length; i++)
          <font color="#0000ff">if</font>(s.equals(flavors[i])) chosen = <font color="#0000ff">true</font>;
        <font color="#0000ff">if</font>(!chosen)
          t.setText("Choose a flavor first!");
        <font color="#0000ff">else</font>
          t.setText("Opening "+ s +". Mmm, mm!");
      }
      <font color="#0000ff">else</font> <font color="#0000ff">if</font>(evt.target.equals(file[1]))
        System.exit(0);
      <font color="#009900">// CheckboxMenuItems cannot use String </font>
      <font color="#009900">// matching; you must match the target:</font>
      <font color="#0000ff">else</font> <font color="#0000ff">if</font>(evt.target.equals(safety[0]))
        t.setText("Guard the Ice Cream! " +
          "Guarding is " + safety[0].getState());
      <font color="#0000ff">else</font> <font color="#0000ff">if</font>(evt.target.equals(safety[1]))
        t.setText("Hide the Ice Cream! " +
          "Is it cold? " + safety[1].getState());
      <font color="#0000ff">else</font> 
        t.setText(arg.toString());
    } 
    <font color="#0000ff">else</font> 
      <font color="#0000ff">return</font> <font color="#0000ff">super</font>.action(evt, arg);
    <font color="#0000ff">return</font> <font color="#0000ff">true</font>;
  }
  <font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> main(String[] args) {
    Menu1 f = <font color="#0000ff">new</font> Menu1();
    f.resize(300,200);
    f.show();
  }
} <font color="#009900">///:~ </PRE></font></font><DIV ALIGN=LEFT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">In
this program I avoided the typical long lists of 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>add(&#160;)</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
calls for each menu because that seemed like a lot of unnecessary typing.
Instead, I placed the menu items into arrays and then simply stepped through
each array calling 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>add(&#160;)</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
in a 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>for</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
loop. This makes adding or subtracting a menu item less tedious.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">As
an alternative approach (which I find less desirable since it requires more
typing), the 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>CheckboxMenuItem</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">s
are created in an array of handles called 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>safety</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">;
this is true for the arrays 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>file</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
and 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>other</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
as well.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">This
program creates not one but two 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>MenuBar</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">s
to demonstrate that menu bars can be actively swapped while the program is
running. You can see how a 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>MenuBar</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
is made up of 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Menu</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">s,
and each 
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Menu</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -