友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
Java编程思想第4版[中文版](PDF格式)-第113部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
static public JMenu
createMenu(Object'''' menuData) {
JMenu menu = new JMenu();
menu。setText((String)menuData'0''0');
menu。setMnemonic(
((Character)menuData'0''1')。charValue());
// Create redundantly; in case there are
// any radio buttons:
bgroup = new ButtonGroup();
for(int i = 1; i 《 menuData。length; i++) {
if(menuData'i''0' == null)
menu。add(new JSeparator());
else
menu。add(createMenuItem(menuData'i'));
}
return menu;
}
static public JMenuItem
createMenuItem(Object'' data) {
JMenuItem m = null;
MType type = (MType)data'1';
if(type == mi)
m = new JMenuItem();
else if(type == cb)
m = new JCheckBoxMenuItem();
else if(type == rb) {
m = new JRadioButtonMenuItem();
bgroup。add(m);
}
m。setText((String)data'0');
476
…………………………………………………………Page 478……………………………………………………………
m。setMnemonic(
((Character)data'2')。charValue());
m。addActionListener(
(ActionListener)data'3');
m。setEnabled(
((Boolean)data'4')。booleanValue());
if(data。length == 6)
m。setIcon((Icon)data'5');
return m;
}
Menus() {
setLayout(new BorderLayout());
add(createMenuBar(menuBar);
BorderLayout。NORTH);
JPanel p = new JPanel();
p。setLayout(new BorderLayout());
p。add(t; BorderLayout。NORTH);
p。add(l; BorderLayout。CENTER);
add(p; BorderLayout。CENTER);
}
public static void main(String args'') {
Show。inFrame(new Menus(); 300; 200);
}
} ///:~
这个程序的目的是允许程序设计者简单地创建表格来描述每个菜单,而不是输入代码行来建立菜单。每个菜
单都产生一个菜单,表格中的第一列包含菜单名和键盘快捷键。其余的列包含每个菜单项的数据:字符串存
在在菜单项中的位置,菜单的类型,它的快捷键,当菜单项被选中时被激活的动作接收器及菜单是否被激活
等信息。如果列开始处是空的,它将被作为一个分隔符来处理。
为了预防浪费和冗长的多个Boolean 创建的对象和类型标志,以下的这些在类开始时就作为 static final 被
创建:bT 和 bF 描述Booleans 和哑类 MType 的不同对象描述标准的菜单项(mi ),复选框菜单项(cb),和
单选钮菜单项(rb)。请记住一组Object 可以拥有单一的Object 句柄,并且不再是原来的值。
这个程序例子同样展示了JLables 和JMenuItems (和它们的衍生事物)如何处理图标的。一个图标经由它的
构建器置放进JLable 中并当对应的菜单项被选中时被改变。
菜单条数组控制处理所有在文件菜单清单中列出的,我们想显示在菜单条上的文件菜单。我们通过这个数组
去使用 createMenuBar(),将数组分类成单独的菜单数据数组,再通过每个单独的数组去创建菜单。这种方
法依次使用菜单数据的每一行并以该数据创建 JMenu,然后为菜单数据中剩下的每一行调用 createMenuItem()
方法。最后,createMenuItem()方法分析菜单数据的每一行并且判断菜单类型和它的属性,再适当地创建菜
单项。终于,像我们在菜单构建器中看到的一样,从表示 createMenuBar(menuBar)的表格中创建菜单,而所
有的事物都是采用递归方法处理的。
这个程序不能建立串联的菜单,但我们拥有足够的知识,如果我们需要的话,随时都能增加多级菜单进去。
13。19。10 弹出式菜单
JPopupMenu 的执行看起来有一些别扭:我们必须调用 enableEvents()方法并选择鼠标事件代替利用事件接收
器。它可能增加一个鼠标接收器但 MouseEvent 从 isPopupTrigger()处不会返回真值——它不知道将激活一
个弹出菜单。另外,当我们尝试接收器方法时,它的行为令人不可思议,这或许是鼠标单击活动引起的。在
下面的程序例子里一些事件产生了这种弹出行为:
//: Popup。java
// Creating popup menus with Swing
package c13。swing;
import java。awt。*;
477
…………………………………………………………Page 479……………………………………………………………
import java。awt。event。*;
import javax。swing。*;
public class Popup extends JPanel {
JPopupMenu popup = new JPopupMenu();
JTextField t = new JTextField(10);
public Popup() {
add(t);
ActionListener al = new ActionListener () {
public void actionPerformed(ActionEvent e){
t。setText(
((JMenuItem)e。getSource())。getText());
}
};
JMenuItem m = new JMenuItem(〃Hither〃);
m。addActionListener(al);
popup。add(m);
m = new JMenuItem(〃Yon〃) ;
m。addActionListener(al);
popup。add(m);
m = new JMenuItem(〃Afar〃);
m。addActionListener(al);
popup。add(m);
popup。addSeparator();
m = new JMenuItem(〃Stay Here〃);
m。addActionListener(al);
popup。add(m);
PopupListener pl = new PopupListener();
addMouseListener(pl);
t。addMouseListener(pl);
}
class PopupListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if(e。isPopupTrigger()) {
popup。show(
e。getponent(); e。getX(); e。getY());
}
}
}
public static void main(String args'') {
Show。inFrame(new Popup();200;150);
}
} ///:~
相同的ActionListener 被加入每个 JMenuItem 中,使其能从菜单标签中取出文字,并将文字插入
JTextField。
478
…………………………………………………………Page 480……………………………………………………………
13。19。11 列表框和组合框
列表框和组合框在 Swing 中工作就像它们在老的AWT 中工作一样,但如果我们需要它,它们同样被增加功
能。另外,它也更加的方便易用。例如,JList 中有一个显示String 数组的构建器(奇怪的是同样的功能在
JboBox 中无效!)。下面的例子显示了它们基本的用法。
//: Listbo。java
// List boxes & bo boxes
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
public class Listbo extends JPanel {
public Listbo() {
setLayout(new GridLayout(2;1));
JList list = new JList(ButtonGroups。ids);
add(new JScrollPane(list));
JboBox bo = new JboBox();
for(int i = 0; i 《 100; i++)
bo。addItem(Integer。toString(i));
add(bo);
}
public static void main(String args'') {
Show。inFrame(new Listbo();200;200);
}
} ///:~
最开始的时候,似乎有点儿古怪的一种情况是 JLists 居然不能自动提供滚动特性——即使那也许正是我们一
直所期望的。增加对滚动的支持变得十分容易,就像上面示范的一样——简单地将JList 封装到
JScrollPane 即可,所有的细节都自动地为我们照料到了。
13。19。12 滑杆和进度指示条
滑杆用户能用一个滑块的来回移动来输入数据,在很多情况下显得很直观(如声音控制)。进程条从“空”
到“满”显示相关数据的状态,因此用户得到了一个状态的透视。我最喜爱的有关这的程序例子简单地将滑
动块同进程条挂接起来,所以当我们移动滑动块时,进程条也相应的改变:
//: Progress。java
// Using progress bars and sliders
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。event。*;
import javax。swing。border。*;
public class Progress extends JPanel {
JProgressBar pb = new JProgressBar();
JSlider sb =
new JSlider(JSlider。HORIZONTAL; 0; 100; 60);
public Progress() {
setLayout(new GridLayout(2;1));
479
…………………………………………………………Page 481……………………………………………………………
add(pb);
sb。setValue(0);
sb。setPaintTicks(true);
sb。setMajorTickSpacing(20);
sb。setMinorTickSpacing(5);
sb。setBorder(new TitledBorder(〃Slide Me〃));
pb。setModel(sb。getModel()); // Share model
add(sb);
}
public static void main(String args'') {
Show。inFrame(new Progress();200;150);
}
} ///:~
JProgressBar 十分简单,但 JSlider 却有许多选项,例如方法、大或小的记号标签。注意增加一个带标题的
边框是多么的容易。
13。19。13 树
使用一个JTree 可以简单地像下面这样表示:
add(new JTree(
new Object'' {〃this〃; 〃that〃; 〃other〃}));
这个程序显示了一个原始的树状物。树状物的 API 是非常巨大的,可是——当然是在Swing 中的巨大。它表
明我们可以做有关树状物的任何事,但更复杂的任务可能需要不少的研究和试验。幸运的是,在库中提供了
一个妥协:“默认的”树状物组件,通常那是我们所需要的。因此大多数的时间我们可以利用这些组件,并
且只在特殊的情况下我们需要更深入的研究和理解。
下面的例子使用了“默认”的树状物组件在一个程序片中显示一个树状物。当我们按下按钮时,一个新的子
树就被增加到当前选中的结点下(如果没有结点被选中,就用根结节):
//: Trees。java
// Simple Swing tree example。 Trees can be made
// vastly more plex than this。
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。tree。*;
// Takes an array of Strings and makes the first
// element a node and the rest leaves:
class Branch {
DefaultMutableTreeNode r;
public Branch(String'' data) {
r = new DefaultMutableTreeNode(data'0');
for(int i = 1; i 《 data。length; i++)
r。add(new DefaultMutableTreeNode(data'i'));
}
public DefaultMutableTreeNode node() {
return r;
}
}
public class Trees extends JPanel {
480
…………………………………………………………Page 482……………………………………………………………
String'''' data = {
{ 〃Colors〃; 〃Red〃; 〃Blue〃; 〃Green〃 };
{ 〃Flavors〃; 〃Tart〃; 〃Sweet〃; 〃Bland〃 };
{ 〃Length〃; 〃Short〃; 〃Medium〃; 〃Long〃 };
{ 〃Volume〃; 〃High〃; 〃Medium〃; 〃Low〃 };
{ 〃Temperature〃; 〃High〃; 〃Medium〃; 〃Low〃 };
{ 〃Intensity〃; 〃High〃; 〃Medium〃; 〃Low〃 };
};
static int i = 0;
DefaultMutableTreeNode root; child; chosen;
JTree tree;
DefaultTreeModel model;
public Trees() {
setLayout(new BorderLayout());
root = new DefaultMutableTreeNode(〃root〃);
tree = new JTree(root);
// Add it and make it take care of scrolling:
add(new JScrollPane(tree);
BorderLayout。CENTER);
// Capture the tree's model:
model =(DefaultTreeModel)tree。getModel();
JButton test = new JButton(〃Press me〃);
test。addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
if(i 《 data。length) {
child = new Branch(data'i++')。node();
// What's the last one you clicked?
chosen = (DefaultMutableTreeNode)
tree。getLastSelectedPathponent();
if(chosen == null) chosen = root;
// The model will create the
// appropria
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!