高级AWT组件的使用
1,Font
package GUI;
import java.awt.BorderLayout;
import java.awt.Choice;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/*1,继承Frame是有用的,我们想用到一个Frame,把结果放在frame里,当然是可以直接像前面的代码那样
* Frame f;然后f.add(...)向Frame里添加组件,本程序用了一种新的方式,继承Frame然后在构造函数里面完成
* 这个任务。
* 2,关于this和super在构造函数里的用法还要看一遍*/
public class FontExample extends Frame implements ItemListener {
Choice chFont,chStyle,chSize;
Label l;
String fontName[] = {"dialog","dialoginput","serif","sansserif","monospaced"};
int fontStyle[] = {Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD|Font.ITALIC};
//main函数
public static void main(String[] args) {
new FontExample();
}
//构造方法
public FontExample()
{
//调用父类的构造函数,等价于Frame f = new Frame("Font Example"),实际上就产生了一个Frame对象
//这个对象没有名字
super("Font Example");
//字名
chFont = new Choice();
for(int i = 0;i < fontName.length;i ++)
chFont.add(fontName[i]);
//字体
chStyle = new Choice();
chStyle.add("标准");
chStyle.add("加粗");
chStyle.add("斜体");
chStyle.add("粗斜体");
//大小
chSize = new Choice();
for(int i =8;i < 72;i = i+2)
chSize.add(Integer.toString(i));
chFont.addItemListener(this);
chStyle.addItemListener(this);
chSize.addItemListener(this);
//把这三个选项放入一个一行三列的Panel对象里
Panel p = new Panel(new GridLayout(1,3));
p.add(chFont);
p.add(chStyle);
p.add(chSize);
//产生一个Label对象
l = new Label("AWT Font Test");
//在调用当前Frame对象的方法,为什么加上this和super都可以?????
add(p,BorderLayout.NORTH);
add(l,BorderLayout.CENTER);
pack();
setVisible(true);
}
//事件响应
public void itemStateChanged(ItemEvent e) {
String name = chFont.getSelectedItem();
int style = fontStyle[chStyle.getSelectedIndex()];
int size = Integer.parseInt(chSize.getSelectedItem());
Font f = new Font(name,style,size);//通过事件响应获取Font对象,Font对象的三个参数
l.setFont(f);//设置Label的Font样式
pack();
}
}

2,Color
package GUI;
import java.awt.*;
import java.awt.event.*;
public class ColorExample extends Frame implements AdjustmentListener
{
Scrollbar red, green, blue;//三个滚动条对象
Checkbox fore, back;//前景和背景选择对象
CheckboxGroup cg;
Label l;//一个Label对象放文字
public static void main(String argv[])
{
new ColorExample();
}
public ColorExample()
{
super("Color Example");//生成一个Frame对象,注意extends Frame!!!
//滚动条的构造方法,设置水平,滚动条初始值,滚动一次卷多少值,滚动最小,最大值
red = new Scrollbar(Scrollbar.HORIZONTAL, 0 ,10, 0, 255);
green = new Scrollbar(Scrollbar.HORIZONTAL, 0 ,10, 0, 255);
blue = new Scrollbar(Scrollbar.HORIZONTAL, 0 ,10, 0, 255);
red.addAdjustmentListener(this);
green.addAdjustmentListener(this);
blue.addAdjustmentListener(this);
Panel p1 = new Panel(new GridLayout(3, 2));//p1来放滚动条,3行2列按行顺序放
p1.add(new Label("红色值:"));
p1.add(red);
p1.add(new Label("绿色值:"));
p1.add(green);
p1.add(new Label("蓝色值:"));
p1.add(blue);
cg = new CheckboxGroup();//用Group实现同时只能单选
fore = new Checkbox("前景颜色", cg, true);
back = new Checkbox("背景颜色", cg, false);
Panel p2 = new Panel();//p2来放前景背景选择
p2.add(fore);
p2.add(back);
l = new Label("Color Test");//l放测试的label
l.setFont(new Font("dialog", Font.BOLD, 24));
add(p1, BorderLayout.NORTH);
add(l, BorderLayout.CENTER);
add(p2, BorderLayout.SOUTH);
pack();
setVisible(true);
}
public void adjustmentValueChanged(AdjustmentEvent e)
{
int r = red.getValue();
int g = green.getValue();
int b = blue.getValue();
if (fore.getState())
l.setForeground(new Color(r, g, b));//设置前景颜色
else
l.setBackground(new Color(r, g, b));
}
}

3,Menu
package GUI;
import java.awt.*;
import java.awt.event.*;
/*1,菜单架构中最上层的是菜单栏MenuBar,一个Frame窗口只能有一个MenuBar,使用Frame类的setMenuBar()
* 来指定要使用的MenuBar对象。
* 2,每个菜单栏可以包含好几个不同的菜单Menu类,在Menu里可以有菜单选项MenuItem,
* 分割线,甚至另一个菜单。
* 3除了一般的菜单选项MenuItem外,还有另一种具有复选框的菜单选项CheckboxMenuItem
* 这个类。
* 4另外还可以使用MenuShortcut类来使用快捷键选择菜单选项。
* 5,最后,还有鼠标右击产生的快捷菜单PopupMenu类*/
public class MenuExample extends MouseAdapter implements ActionListener, ItemListener
{
Frame f;
Label l;
PopupMenu pm;
public static void main(String argv[])
{
new MenuExample();
}
public MenuExample()
{
f = new Frame("Menu Example");
f.addMouseListener(this);//要注册f,因为显示快捷菜单的时候要根据鼠标点击位置获取f内的坐标
//菜单Menu item1 ,是一个嵌套的menu,它又作为Menu menu1的一个菜单选项(注意菜单和菜单选项的区别)
MenuItem item1_1 = new MenuItem("Item1_1");
MenuItem item1_2 = new MenuItem("Item1_2");
MenuItem item1_3 = new MenuItem("Item1_3");
item1_1.addActionListener(this);
item1_2.addActionListener(this);
item1_3.addActionListener(this);
Menu item1 = new Menu("Item1", false);
item1.add(item1_1);
item1.add(item1_2);
item1.add(item1_3);
//带快捷键的菜单选项MenuItem item2
MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);
MenuItem item2 = new MenuItem("Item2", ms);
item2.addActionListener(this);
//复选菜单选项CheckboxMenuItem item3
CheckboxMenuItem item3 = new CheckboxMenuItem("Item3");
item3.addItemListener(this);
//将以上三个菜单选项加入菜单Menu menu1中(其中菜单选项item1本身又是一个菜单)
Menu menu1 = new Menu("Menu1");
menu1.add(item1);//
menu1.add(item2);
menu1.addSeparator();//分割线
menu1.add(item3);
//另一个菜单Menu help,实现同上
Menu help = new Menu("Help");
MenuItem help1 = new MenuItem("Index");
MenuItem help2 = new MenuItem("About");
help1.addActionListener(this);
help2.addActionListener(this);
help.add(help1);
help.addSeparator();
help.add(help2);
//点击鼠标所产生的快捷菜单pm
MenuItem popup1 = new MenuItem("popup1");
MenuItem popup2 = new MenuItem("popup2");
popup1.addActionListener(this);
popup2.addActionListener(this);
pm = new PopupMenu();
pm.add(popup1);
pm.add(popup2);
//架构最上层的菜单栏MenuBar mb,分别将menu1和help放入菜单栏
MenuBar mb = new MenuBar();
mb.add(menu1);
mb.setHelpMenu(help);//和mb.add(help)效果一样;
////设置f的菜单栏,一个显示文字的label和一个快捷菜单pm
f.setMenuBar(mb);
l = new Label("No menu item selected!");
f.add(pm);
f.add(l, BorderLayout.NORTH);
f.setSize(200,100);
f.setVisible(true);
}
//单选菜单选项和复选菜单选项的处理不一样,一个是actionPerformed一个是itemStateChanged
public void actionPerformed(ActionEvent e)
{
MenuItem mi = (MenuItem)e.getSource();
l.setText(mi.getLabel()+" selected!");
}
public void itemStateChanged(ItemEvent e)
{
CheckboxMenuItem cmi = (CheckboxMenuItem)e.getSource();
l.setText(cmi.getLabel()+" selected!");
}
//鼠标事件产生快捷菜单pm
public void mouseClicked(MouseEvent e)
{
pm.show(f, e.getX(), e.getY());//在f里指定坐标处显示快捷菜单PopupMenu
}
}

4,Dialog
package GUI;
import java.awt.*;
import java.awt.event.*;
/*在之前的程序中我们一直使用了Frame类,其实继承了window类的除了Frame以外,还有另一个类也是继承自windows
* 类的,它就是Dialog类,用来报告消息。
* 基本上Dialog对象是不能单独存在的,它一定得伴随某个Frame或者Dialog对象才行
* Dialog的构造函数有三个参数,第一个指定伴随的Frame或者Dialog对象,第二个可以指定此Dialog自己的标题,第
* 三个指定显示模式 */
public class DialogExample extends WindowAdapter implements ActionListener
{
Frame f;
Dialog d;
Checkbox ch;
Button b;
public static void main(String argv[])
{
new DialogExample();
}
public DialogExample()
{
f = new Frame("Dialog Example");
ch = new Checkbox("Modal");
b = new Button("Show Dialog");
b.addActionListener(this);
f.add(ch, BorderLayout.NORTH);
f.add(b, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
d = new Dialog(f, "I'm a Dialog", ch.getState());//Dialog构造函数的参数
d.addWindowListener(this);//为Dialog添加WindowListener监听实现Dialog窗口关闭
d.setSize(100,100);
b.setEnabled(false);//产生Dialog后,button就失效
d.show();
}
public void windowClosing(WindowEvent e)
{
d.dispose();
b.setEnabled(true);
}
}
5,FileDialog
package GUI;
import java.awt.*;
import java.awt.event.*;
/*1,在AWT包中只提供了一种系统对话框,就是FileDialog类,它会产生打开或保存文件的对话框让你选择系统中的某个
* 文件,在后面我们将继续介绍一组名为Swing德组件,在Swing包里的JDialog提供了更为丰富的对话框种类
* 2,其实LOAD和SAVE模式只有对话框上文字显示的区别,FileDialog对象只是用来选择文件路径和名称而已,并不对
* 文件作什么实际的访问动作,!!!!对文件处理是有文件处理的类来完成的。可以由FileDialog对象返回路径名称给
* 文件处理的相关类,然后来决定怎么去操作。*/
public class FileDialogExample implements ActionListener
{
Frame f;
FileDialog fd;
Checkbox chLoad, chSave;
CheckboxGroup cg;
Button b;
Label lbDir, lbFile;
public static void main(String arv[])
{
new FileDialogExample();
}
public FileDialogExample()
{
f = new Frame("FileDialog Example");
fd = new FileDialog(f);
cg = new CheckboxGroup();
chLoad = new Checkbox("LOAD", true, cg);
chSave = new Checkbox("SAVE", false, cg);
Panel p1 = new Panel();
p1.add(chLoad);
p1.add(chSave);
lbDir = new Label("Directory: ");
lbFile = new Label("File Name: ");
Panel p2 = new Panel(new GridLayout(2,1));
p2.add(lbDir);
p2.add(lbFile);
b = new Button("Show");
b.addActionListener(this);
f.add(p1, BorderLayout.NORTH);
f.add(p2, BorderLayout.CENTER);
f.add(b, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if (chLoad.getState())
fd.setMode(FileDialog.LOAD);
else
fd.setMode(FileDialog.SAVE);
fd.show();//显示FileDialog对话框
lbDir.setText("Directory: "+fd.getDirectory());//从fd对象获取选中的文件信息
lbFile.setText("File Name: "+fd.getFile());
f.pack();
}
}


浙公网安备 33010602011771号