按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
String title = jp。getClass()。toString();
// Remove the word 〃class〃:
if(title。indexOf(〃class〃) != …1)
title = title。substring(6);
JFrame frame = new JFrame(title);
frame。addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System。exit(0);
}
});
frame。getContentPane()。add(
jp; BorderLayout。CENTER);
frame。setSize(width; height);
frame。setVisible(true);
}
} ///:~
那些想显示它们自己的类将从 JPanel 处继承并且随后为它们自己增加一些可视化的组件。最后,它们创建一
个包含下面这一行程序的main():
Show。inFrame(new MyClass(); 500; 300);
最后的两个自变量是显示的宽度和高度。
注意JFrame 的标题是用 RTTI 产生的。
13。19。4 工具提示
几乎所有我们利用来创建我们用户接口的来自于Jponent 的类都包含一个称为setToolTipText(string)
的方法。因此,几乎任何我们所需要表示的(对于一个对象jc 来说就是一些来自Jponent 的类)都可以
安放在窗体中:
jc。setToolTipText(〃My tip〃);
并且当鼠标停在Jponent 上一个超过预先设置的一个时间,一个包含我们的文字的小框就会从鼠标下弹
出。
13。19。5 边框
Jponent 同样包括一个称为 setBorder()的方法,该方法允许我们安放一些各种各样有趣的边框到一些可
见的组件上。下面的程序例子利用一个创建JPanel 并安放边框到每个例子中的被称为 showBorder()的方
法,示范了一些有用的不同的边框。同样,它也使用RTTI 来找我们使用的边框名(剔除所有的路径信息),
然后将边框名放到面板中间的 JLable 里:
//: Borders。java
// Different Swing borders
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。border。*;
public class Borders extends JPanel {
static JPanel showBorder(Border b) {
469
…………………………………………………………Page 471……………………………………………………………
JPanel jp = new JPanel();
jp。setLayout(new BorderLayout());
String nm = b。getClass()。toString();
nm = nm。substring(nm。lastIndexOf('。') + 1);
jp。add(new JLabel(nm; JLabel。CENTER);
BorderLayout。CENTER);
jp。setBorder(b);
return jp;
}
public Borders() {
setLayout(new GridLayout(2;4));
add(showBorder(new TitledBorder(〃Title〃)));
add(showBorder(new EtchedBorder()));
add(showBorder(new LineBorder(Color。blue)));
add(showBorder (
new MatteBorder(5;5;30;30;Color。green)));
add(showBorder(
new BevelBorder(BevelBorder。RAISED)));
add(showBorder(
new SoftBevelBorder(BevelBorder。LOWERED)));
add(showBorder(new poundBorder(
new EtchedBorder();
new LineBorder(Color。red))));
}
public static void main(String args'') {
Show。inFrame(new Borders(); 500; 300);
}
} ///:~
这一节中大多数程序例子都使用TitledBorder,但我们可以注意到其余的边框也同样易于使用。能创建我们
自己的边框并安放它们到按钮、标签等等内——任何来自 Jponent 的东西。
13。19。6 按钮
Swing 增加了一些不同类型的按钮,并且它同样可以修改选择组件的结构:所有的按钮、复选框、单选钮,
甚至从AbstractButton 处继承的菜单项(这是因为菜单项一般被包含在其中,它可能会被改进命名为
“AbstractChooser”或者相同的什么名字)。我们会注意使用菜单项的简便,下面的例子展示了不同类型的
可用的按钮:
//: Buttons。java
// Various Swing buttons
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。plaf。basic。*;
import javax。swing。border。*;
public class Buttons extends JPanel {
JButton jb = new JButton(〃JButton〃);
BasicArrowButton
up = new BasicArrowButton(
BasicArrowButton。NORTH);
470
…………………………………………………………Page 472……………………………………………………………
down = new BasicArrowButton(
BasicArrowButton。SOUTH);
right = new BasicArrowButton(
BasicArrowButton。EAST);
left = new BasicArrowButton(
BasicArrowButton。WEST);
public Buttons() {
add(jb);
add(new JToggleButton(〃JToggleButton〃));
add(new JCheckBox(〃JCheckBox〃));
add(new JRadioButton(〃JRadioButton〃));
JPanel jp = new JPanel();
jp。setBorder(new TitledBorder(〃Directions〃));
jp。add(up);
jp。add(down);
jp。add(left);
jp。add(right);
add(jp);
}
public static void main(String args'') {
Show。inFrame(new Buttons(); 300; 200);
}
} ///:~
JButton 看起来像AWT 按钮,但它没有更多可运行的功能(像我们后面将看到的如加入图像等)。在
。sun。java。swing。basic 里,有一个更合适的 BasicArrowButton 按钮,但怎样测试它呢?有两种类型的
“指针”恰好请求箭头按钮使用:Spinner 修改一个中断值,并且 StringSpinner 通过一个字符串数组来移
动(当它到达数组底部时,甚至会自动地封装)。ActionListeners 附着在箭头按钮上展示它使用的这些相
关指针:因为它们是Bean ,我们将期待利用方法名,正好捕捉并设置它们的值。
当我们运行这个程序例子时,我们会发现触发按钮保持它最新状态,开或时关。但复选框和单选钮每一个动
作都相同,选中或没选中(它们从 JToggleButton 处继承)。
13。19。7 按钮组
如果我们想单选钮保持“异或”状态,我们必须增加它们到一个按钮组中,这几乎同老AWT 中的方法相同但
更加的灵活。在下面将要证明的程序例子是,一些 AbstruactButton 能被增加到一个ButtonGroup 中。
为避免重复一些代码,这个程序利用映射来生不同类型的按钮组。这会在 makeBPanel 中看到,makeBPanel
创建了一个按钮组和一个JPanel,并且为数组中的每个 String 就是makeBPanel 的第二个自变量增加一个类
对象,由它的第一个自变量进行声明:
//: ButtonGroups。java
// Uses reflection to create groups of different
// types of AbstractButton。
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。border。*;
import java。lang。reflect。*;
public class ButtonGroups extends JPanel {
static String'' ids = {
〃June〃; 〃Ward〃; 〃Beaver〃;
471
…………………………………………………………Page 473……………………………………………………………
〃Wally〃; 〃Eddie〃; 〃Lumpy〃;
};
static JPanel
makeBPanel(Class bClass; String'' ids) {
ButtonGroup bg = new ButtonGroup();
JPanel jp = new JPanel();
String title = bClass。getName();
title = title。substring(
title。lastIndexOf('。') + 1);
jp。setBorder(new TitledBorder(title));
for(int i = 0; i 《 ids。length; i++) {
AbstractButton ab = new JButton(〃failed〃);
try {
// Get the dynamic constructor method
// that takes a String argument:
Constructor ctor = bClass。getConstructor(
new Class'' { String。class });
// Create a new object:
ab = (AbstractButton)ctor。newInstance(
new Object''{ids'i'});
} catch(Exception ex) {
System。out。println(〃can't create 〃 +
bClass);
}
bg。add(ab);
jp。add(ab);
}
return jp;
}
public ButtonGroups() {
add(makeBPanel(JButton。class; ids));
add(makeBPanel(JToggleButton。class; ids));
add(makeBPanel(JCheckBox。class; ids));
add(makeBPanel(JRadioButton。class; ids));
}
public static void main(String args'') {
Show。inFrame(new ButtonGroups(); 500; 300);
}
} ///:~
边框标题由类名剔除了所有的路径信息而来。AbstractButton 初始化为一个 JButton,JButtonr 的标签发生
“失效”,因此如果我们忽略这个异常信息,我们会在屏幕上一直看到这个问题。getConstructor()方法产
生了一个通过getConstructor()方法安放自变量数组类型到类数组的构建器对象,然后所有我们要做的就是
调用newInstance() ,通过它一个数组对象包含我们当前的自变量——在这种例子中,就是 ids 数组中的