高级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(); } }