《Java 2 实用教程》课程学习(9)

本章内容

  • Java把由Component类的子类或间接子类创建的对象称为一个组件;
  • Java把由Container类的子类或间接子类创建的对象称为一个容器;
  • 可以向容器添加一个组件。 Component类提供了一个public方法:add(),一个容器可以调用这个方法将组件添加到该容器中。
  • 容器调用removeAll()方法可以移去容器中的全部组件,调用remove(Component c)方法可以移去容器中参数指定的组件。
  • 每当容器添加新的组件或移去组件时,应当让容器调用validate()方法,以保证容器中的组件能正确显示出来。
  • 容器本身也是一个组件,因此可以把一个容器添加到另一个容器中,实现容器的嵌套。

9.1  Java窗口

  1. import java.awt.*;//为组件添加
  2. import javax.swing.*;//为容器添加

实例方法:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class Example {
  4. public static void main(String args[]) {
  5. JFrame window1=new JFrame("第一个窗口");
  6. JFrame window2=new JFrame("第二个窗口");
  7. window1.setBounds(60,100,188,108);
  8. window2.setBounds(260,100,188,108);
  9. window1.setVisible(true);
  10. window1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  11. window2.setVisible(true);
  12. window2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. }
  14. }

二、菜单条、菜单、菜单项

在一个窗口中添加多个菜单条,只有最后一个被添加。 不能用add方法将菜单条添加到窗口中。

2. JMenu 菜单

3. JMenuItem 菜单项

4. 嵌入子菜单

  1. import java.awt.*;
  2. class FirstWindow extends Frame
  3. {
  4. MenuBar menubar;
  5. Menu menu;
  6. MenuItem item1,item2;
  7. FirstWindow(String s)
  8. {
  9. super(s);
  10. setSize(160,170);
  11. setLocation(120,120);
  12. setVisible(true);
  13. menubar=new MenuBar();
  14. menu=new Menu("文件");
  15. item1=new MenuItem();
  16. item2=new MenuItem("保存");
  17. menu.add(item1);
  18. menu.add(item2);
  19. menubar.add(menu);
  20. setMenuBar(menubar);
  21. }
  22. }
  23. public class Example6_1
  24. {
  25. public static void
  26. main(String args[])
  27. {
  28. FirstWindow win
  29. =new FirstWindow
  30. ("一个简单的窗口");
  31. }
  32. }
  1. MenuBar menubar=new MenuBar();
  2. Menu fileM=new Menu("File");
  3. Menu editM=new Menu("Edit");
  4. Menu toolsM=new Menu("Tools");
  5. Menu helpM=new Menu("Help");
  6. MenuItem fileM1=new MenuItem("New");
  7. MenuItem fileM2=new MenuItem("Open");
  8. MenuItem fileM3=new MenuItem("Save");
  9. Menu fileM4=new Menu("Print");
  10. CheckboxMenuItem fileM5=new CheckboxMenuItem("Quit",true);
  11. MenuItem printM=new MenuItem("Preview");
  12. MenuItem setM=new MenuItem("Setting");
  13. menubar.add(fileM);
  14. menubar.add(editM);
  15. menubar.add(toolsM);
  16. menubar.add(helpM);
  17. fileM.add(fileM1); fileM.add(fileM2);
  18. fileM.add(fileM3); fileM.add(fileM4);
  19. fileM.addSeparator();
  20. fileM4.add(printM); fileM4.add(setM);
  21. fileM.add(fileM5);
  1. //Example.java
  2. public class Example {
  3. public static void main(String args[]) {
  4. WindowMenu win=new WindowMenu("带菜单的窗口",20,30,200,190);
  5. }
  6. }
  7. //WindowMenu.java
  8. import javax.swing.*;
  9. import java.awt.event.InputEvent;
  10. import java.awt.event.KeyEvent;
  11. public class WindowMenu extends JFrame {
  12. JMenuBar menubar;
  13. JMenu menu,subMenu;
  14. JMenuItem itemLiterature,itemCooking;
  15. public WindowMenu(){}
  16. public WindowMenu(String s,int x,int y,int w,int h) {
  17. init(s);
  18. setLocation(x,y);
  19. setSize(w,h);
  20. setVisible(true);
  21. setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  22. }
  23. void init(String s){
  24. setTitle(s);
  25. menubar=new JMenuBar();
  26. menu=new JMenu("菜单");
  27. subMenu=new JMenu("体育话题");
  28. itemLiterature=new JMenuItem("文学话题",new ImageIcon("a.gif"));
  29. itemCooking=new JMenuItem("烹饪话题",new ImageIcon("b.gif"));
  30. itemLiterature.setAccelerator(KeyStroke.getKeyStroke('A'));
  31. itemCooking.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
  32. InputEvent.CTRL_MASK));
  33. menu.add(itemLiterature);
  34. menu.addSeparator(); menu.add(itemCooking);
  35. subMenu.add( new JMenuItem( "足球",new ImageIcon("c.gif") ) );
  36. subMenu.add(new JMenuItem("篮球",new ImageIcon("d.gif")));
  37. menu.add(subMenu);
  38. menubar.add(menu);
  39. setJMenuBar(menubar);
  40. }
  41. }

9.2  文本框组件

其它常用实例方法:

  1. import java.awt.*;
  2. class WindowText extends Frame
  3. {
  4. TextField text1,text2;
  5. WindowText(String s)
  6. {
  7. super(s);
  8. setLayout(new FlowLayout());
  9. setBounds(100,100,150,150);
  10. setVisible(true);
  11. text1=new TextField("输入密码:",10);
  12. text1.setEditable(false);
  13. text2=new TextField(10);
  14. text2.setEchoChar('*');
  15. add(text1);
  16. add(text2);
  17. validate();
  18. }
  19. }
  20. class Example
  21. {
  22. public static void main(String args[])
  23. {
  24. WindowText win=new WindowText("窗口");
  25. }
  26. }

学习组件除了了解组件的属性和功能外,一个更重要的方面是学习怎样处理组件上发生的界面事件。

程序需要对组件上发生的事件做出反应,从而实现特定的任务。

在学习处理事件时,必须很好地掌握事件源、监视器、处理事件的接口这三个概念,下面通过处理文本框这个具体组件上的事件,来掌握处理事件的基本原理。

二、TextField上的ActionEvent事件

3.处理事件的接口

4.ActionEvent类中的方法

方法一:

只有一个监视器 --- MyWindow,该监视器实现接口ActionListener

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. class MyWindow extends Frame implements ActionListener
  4. {
  5. TextField text1,text2,text3;
  6. MyWindow(String s)
  7. { super(s);
  8. setLayout(new FlowLayout());
  9. text1=new TextField(10);
  10. text2=new TextField(10);
  11. text3=new TextField(10);
  12. text2.setEditable(false);
  13. text3.setEditable(false);
  14. add(text1);
  15. add(text2);
  16. add(text3);
  17. text1.addActionListener(this);
  18. setBounds(100,100,150,150);
  19. setVisible(true);
  20. validate();
  21. }
  22. public void actionPerformed(ActionEvent e)
  23. {
  24. int n=0;
  25. try
  26. {
  27. n=Integer.parseInt(text1.getText());
  28. text2.setText(n+"的平方是:"+n*n);
  29. text3.setText(n+"的立方是:"+n*n*n);
  30. }
  31. catch(NumberFormatException ee)
  32. {
  33. text1.setText("请输入数字字符");
  34. }
  35. }
  36. }
  37. class actionDemo
  38. { public static void main(String args[])
  39. { new MyWindow("窗口"); }
  40. }

方法二:

有两个监视器----Policeman_2,Policeman_3,这两个监视器均实现接口ActionListener

  1. class actionDemo
  2. {
  3. public static void main(String args[])
  4. {
  5. new MyWindow("窗口");
  6. }
  7. }
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. class MyWindow extends Frame
  11. { TextField text1,text2,text3;
  12. PoliceMan_2 police_2=new PoliceMan_2(this);
  13. PoliceMan_3 police_3=new PoliceMan_3(this);
  14. MyWindow(String s)
  15. { super(s);
  16. setLayout(new FlowLayout());
  17. text1=new TextField(20);
  18. text2=new TextField(20);
  19. text2.setEditable(false);
  20. text3=new TextField(20);
  21. text3.setEditable(false);
  22. add(text1); add(text2); add(text3);
  23. text1.addActionListener(police_2);
  24. text1.addActionListener(police_3);
  25. setBounds(100,100,300,150);
  26. setVisible(true);
  27. validate();
  28. }
  29. }
  30. class PoliceMan_2 implements ActionListener
  31. {
  32. MyWindow win;
  33. PoliceMan_2(MyWindow a)
  34. {win=a;
  35. }
  36. public void actionPerformed(ActionEvent e)
  37. {
  38. int n=0,m=0;
  39. try{
  40. n=Integer.parseInt(win.text1.getText());
  41. m=n*n;
  42. win.text2.setText(n+"的平方是:"+m);
  43. }
  44. catch(Exception ee)
  45. {
  46. win.text1.setText("请输入数字字符");
  47. }
  48. }
  49. }
  50. class PoliceMan_3 implements ActionListener
  51. {
  52. MyWindow win;
  53. PoliceMan_3(MyWindow a)
  54. {win=a;
  55. }
  56. public void actionPerformed(ActionEvent e)
  57. {
  58. int n=0,m=0;
  59. try{
  60. n=Integer.parseInt(win.text1.getText());
  61. m=n*n*n;
  62. win.text3.setText(n+"的立方是:"+m);
  63. }
  64. catch(Exception ee)
  65. {
  66. win.text1.setText("请输入数字字符");
  67. }
  68. }
  69. }

9.3  标签

9.4  按钮组件

二、Button上的ActionEvent事件

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. class WindowButton extends Frame implements ActionListener
  4. { int number;
  5. TextField 提示条,输入框;
  6. Button nuttonGetNumber,buttonEnter;
  7. WindowButton(String s)
  8. { super(s);
  9. setLayout(new FlowLayout());
  10. nuttonGetNumber=new Button("得到一个随机数");
  11. 提示条=new TextField("输入你的猜测:",10);
  12. 提示条.setEditable(false);
  13. 输入框=new TextField("0",10);
  14. buttonEnter=new Button("确定");
  15. add(nuttonGetNumber); add(提示条); add(输入框);
  16. add(buttonEnter);
  17. buttonEnter.addActionListener(this);
  18. nuttonGetNumber.addActionListener(this);
  19. setBounds(100,100,200,200);
  20. setVisible(true);
  21. validate();
  22. }
  23. public void actionPerformed(ActionEvent e)
  24. { if(e.getSource()==nuttonGetNumber)
  25. { number=(int)(Math.random()*100)+1;
  26. 提示条.setText("输入你的猜测:");
  27. }
  28. else if(e.getSource()==buttonEnter)
  29. { int guess;
  30. try {
  31. guess=Integer.parseInt(输入框.getText());
  32. if(guess==number)
  33. { 提示条.setText("猜对了!");
  34. }
  35. else if(guess>number)
  36. { 提示条.setText("猜大了!");
  37. 输入框.setText(null);
  38. }
  39. else if(guess<number)
  40. { 提示条.setText("猜小了!");
  41. 输入框.setText(null);
  42. }
  43. }
  44. catch(NumberFormatException event)
  45. {
  46. 提示条.setText("请输入数字字符");
  47. }
  48. }
  49. }
  50. }
  51. class Example6_7
  52. {
  53. public static void main(String args[])
  54. {
  55. new WindowButton("窗口");
  56. }
  57. }

输出结果:

9.5  面板

java.awt包中的类Panel 用来建立面板的,因为Panel类是Container的子类,因此,Panel类及它的子类的实例也是一个容器。一个容器里添加若干个组件后,再放到另一个容器里,称做容器的嵌套。

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class Example6_10
  4. {
  5. public static void main(String args[])
  6. {
  7. new WindowPanel();
  8. }
  9. }
  10. class Mypanel extends Panel implements ActionListener
  11. {
  12. Button button;
  13. Label lab;
  14. Mypanel( )
  15. {
  16. lab=new Label("单击按钮关闭程序");
  17. button=new Button("关闭程序");
  18. add(lab);
  19. add(button);
  20. button.addActionListener(this);
  21. setBackground(Color.pink); //设置面板的底色
  22. }
  23. public void actionPerformed(ActionEvent e)
  24. {
  25. System.exit(0);
  26. }
  27. }
  28. class WindowPanel extends Frame
  29. {
  30. Mypanel panel1,panel2;
  31. Button button;
  32. WindowPanel( )
  33. {
  34. setLayout(new FlowLayout());
  35. panel1=new Mypanel();
  36. panel2=new Mypanel();
  37. button=new Button("我不在那些面板里");
  38. add(panel1);
  39. add(panel2);
  40. add(button);
  41. setBounds(120,125,200,200);
  42. setVisible(true);
  43. validate();
  44. }
  45. }

9.6  Component类的常用方法

二、组件的大小与位置

三、组件的激活与可见性

四、组件的字体

获取计算机上字体名字的步骤:

  1. GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  2. String fontName[] = ge.getAvailableFontFamileNames();

9.7  布局

  1. import java.awt.*;
  2. class WindowFlow extends Frame
  3. { WindowFlow(String s)
  4. {
  5. super(s);
  6. setBounds(100,100,400,320);
  7. setVisible(true);
  8. FlowLayout flow=new FlowLayout();
  9. flow.setAlignment(FlowLayout.LEFT);
  10. flow.setHgap(2);
  11. flow.setVgap(8);
  12. setLayout(flow);
  13. for(int i=1;i<=10;i++)
  14. { add(new Button("i am "+i)); }
  15. validate();
  16. }
  17. }
  18. class Example
  19. { public static void main(String args[])
  20. { WindowFlow win=new WindowFlow("FlowLayout布局窗口");
  21. }
  22. }

二、BorderLayout布局

  1. import java.awt.*;
  2. class Example6_3
  3. { public static void main(String args[])
  4. { Frame win=new Frame("窗体");
  5. BorderLayout border=new BorderLayout();
  6. win.setLayout(border);
  7. win.setBounds(100,100,300,300);
  8. win.setVisible(true);
  9. Button bSouth=new Button("我在南边"),
  10. bNorth=new Button("我在北边"),
  11. bEast =new Button("我在东边"),
  12. bWest =new Button("我在西边"),
  13. bCenter=new Button("我在中心");
  14. win.add(bNorth,BorderLayout.NORTH);
  15. win.add(bSouth,BorderLayout.SOUTH);
  16. win.add(bEast,BorderLayout.EAST);
  17. win.add(bWest,BorderLayout.WEST);
  18. win.add(bCenter,BorderLayout.CENTER);
  19. win.validate();
  20. }
  21. }

三、CardLayout布局

  1. import java.awt.*;
  2. class WindowFlow extends Frame
  3. { WindowFlow(String s)
  4. { super(s);
  5. setBounds(100,100,150,120);
  6. setVisible(true);
  7. CardLayout card=new CardLayout();
  8. setLayout(card);
  9. String str="a";
  10. add(str,new Button("button1"));
  11. card.show(this,str);
  12. validate();
  13. }
  14. }
  15. class Example6_4
  16. {
  17. public static void main(String args[])
  18. {
  19. WindowFlow win=new WindowFlow("CardLayout布局窗口");
  20. }
  21. }

四、GridLayout布局

  1. import java.awt.*;
  2. class WindowFlow extends Frame
  3. { WindowFlow(String s)
  4. { super(s);
  5. setBounds(100,100,150,120);
  6. setVisible(true);
  7. GridLayout grid=new GridLayout(3,2);
  8. setLayout(grid);
  9. for(int i=1;i<7;i++)
  10. add(new Button("button"+i));
  11. validate();
  12. }
  13. }
  14. class Example6_5
  15. {
  16. public static void main(String args[])
  17. {
  18. new WindowFlow("GridLayout布局窗口");
  19. }
  20. }

五、BoxLayout布局

  1. import javax.swing.*;
  2. import javax.swing.border.*;
  3. import java.awt.*;
  4. class WindowBox extends Frame
  5. {
  6. WindowBox(String s)
  7. { Frame frame=new Frame(s);
  8. frame.setBounds(120,125,200,200);
  9. frame.setVisible(true);
  10. BoxLayout box=new BoxLayout(frame,BoxLayout.Y_AXIS);
  11. frame.setLayout(box);
  12. frame.add(new Button("button1"));
  13. frame.add(new Button("button2"));
  14. frame.add(new Button("button3"));
  15. frame.add(new Button("button4"));
  16. frame.validate();
  17. }
  18. }
  19. public class Example6_7
  20. { public static void main(String args[])
  21. { new WindowBox("盒式布局"); }
  22. }

Box类中的静态方法:

  1. import java.awt.*;
  2. import javax.swing.*;
  3. import javax.swing.border.*;
  4. class WindowBox extends Frame
  5. { Box baseBox ,boxV1,boxV2;
  6. WindowBox()
  7. { setLayout(new FlowLayout());
  8. setBounds(120,125,200,200);
  9. setVisible(true);
  10. boxV1=Box.createVerticalBox();
  11. boxV1.add(new Label("输入您的姓名"));
  12. boxV1.add(Box.createVerticalStrut(8));
  13. boxV1.add(new Label("输入email"));
  14. boxV1.add(Box.createVerticalStrut(8));
  15. boxV1.add(new Label("输入您的职业"));
  16. boxV2=Box.createVerticalBox();
  17. boxV2.add(new TextField(16));
  18. boxV2.add(Box.createVerticalStrut(8));
  19. boxV2.add(new TextField(16));
  20. boxV2.add(Box.createVerticalStrut(8));
  21. boxV2.add(new TextField(16));
  22. baseBox=Box.createHorizontalBox();
  23. baseBox.add(boxV1);
  24. baseBox.add(Box.createHorizontalStrut(10));
  25. baseBox.add(boxV2);
  26. add(baseBox);
  27. validate();
  28. }
  29. }
  30. public class Example6_8
  31. {
  32. public static void main(String args[])
  33. {
  34. new WindowBox();
  35. }
  36. }

六、null布局

9.8  文本区组件

  1. class Example
  2. { public static void main(String args[])
  3. { WindowTextArea win=new WindowTextArea("窗口"); }
  4. }
  5. import java.awt.*;
  6. import java.awt.event.*;
  7. import java.util.*;
  8. class WindowTextArea extends Frame implements TextListener
  9. {
  10. TextArea text1,text2;
  11. WindowTextArea(String s)
  12. {
  13. super(s);
  14. setLayout(new FlowLayout());
  15. text1=new TextArea(6,15);
  16. text2=new TextArea(6,15);
  17. add(text1);
  18. add(text2);
  19. text2.setEditable(false);
  20. text1.addTextListener(this) ;
  21. setBounds(100,100,150,150);
  22. setVisible(true);
  23. validate();
  24. }
  25. public void textValueChanged(TextEvent e)
  26. { if(e.getSource()==text1)
  27. {
  28. String s=text1.getText();
  29. StringTokenizer fenxi=new StringTokenizer(s," ,'\n' ");
  30. int n=fenxi.countTokens();
  31. String a[]=new String[n];
  32. for(int i=0;i<=n-1;i++)
  33. {String temp=fenxi.nextToken();
  34. a[i]=temp;
  35. }
  36. Arrays.sort(a); //按字典序从小到大排序
  37. text2.setText(null); //刷新显示
  38. for(int i=0;i<n;i++)
  39. {
  40. text2.append(a[i]+"\n");
  41. }
  42. }
  43. }
  44. }

二、TextArea上的TextEvent事件

9.9  画布

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class Example6_10
  4. {
  5. public static void main(String args[])
  6. {
  7. new WindowCanvas();
  8. }
  9. }
  1. class Mycanvas extends Canvas
  2. {
  3. Mycanvas()
  4. { setSize(100,100); //设置画布的初始大小
  5. setBackground(Color.cyan); } //设置画布的背景色
  6. public void paint(Graphics g)
  7. {g.setColor(Color.orange);
  8. g.fillOval(12,12,45,60); } //在画布上绘制椭圆
  9. }
  10. class WindowCanvas extends Frame
  11. { Mycanvas canvas;
  12. WindowCanvas()
  13. {canvas=new Mycanvas( );
  14. setLayout(new FlowLayout());
  15. add(canvas);
  16. setBounds(120,125,580,300);
  17. setBackground(Color.pink); //设置窗口的背景色
  18. setVisible(true);
  19. validate();
  20. addWindowListener(new WindowAdapter()
  21. {public void windowClosing(WindowEvent e)
  22. {System.exit(0);}
  23. }
  24. ); }
  25. }

fillOval(left, top, w, h ) 前两个参数为该椭圆外接矩形的左上顶点,后两个参数为其外接矩形的宽和高,当后两个参数的值相等时为圆

paint方法与repaint方法

Component类有一个方法:public void paint(Graphics g),我们可以在其子类中重写这个方法。

当重写这个方法时,相应的java运行环境将参数g实例化,这样我们就可以在子类中使用g调用相应的方法,进行图形的绘制。

调用repaint()方法时,程序首先清除paint()方法以前所画的内容,然后再调用paint()方法,实际上当调用repaint()方法时,程序自动先调用update()方法,该方法的功能是:清除paint()方法以前所画的内容,然后再调用paint()方法。我们可以在子类中重写update()方法,根据需要选择清除哪些部分或保留哪些部分。

9.10  窗口事件

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. class MyFrame extends Frame implements WindowListener
  4. {
  5. TextArea text;
  6. MyFrame(String s)
  7. {
  8. super(s);
  9. setBounds(100,100,200,300);
  10. setVisible(true);
  11. text=new TextArea();
  12. add(text,BorderLayout.CENTER);
  13. addWindowListener(this);
  14. validate();
  15. }
  16. public void windowActivated(WindowEvent e)
  17. {
  18. text.append("\n我被激活");
  19. validate();
  20. }
  21. public void windowDeactivated(WindowEvent e)
  22. {
  23. text.append("\n我不是激活状态了");
  24. setBounds(0,0,400,400);
  25. validate();
  26. }
  27. public void windowClosing(WindowEvent e)
  28. {
  29. System.out.println("\n窗口正在关闭呢");
  30. dispose();
  31. }
  32. public void windowClosed(WindowEvent e)
  33. {
  34. System.out.println("程序结束运行");
  35. System.exit(0);
  36. }
  37. public void windowIconified(WindowEvent e)
  38. {
  39. text.append("\n我图标化了");
  40. }
  41. public void windowDeiconified(WindowEvent e)
  42. {
  43. text.append("\n我撤消图标化");
  44. setBounds(0,0,400,400);
  45. validate();
  46. }
  47. public void windowOpened(WindowEvent e) { }
  48. }
  49. class Example6_16
  50. {
  51. public static void main(String args[])
  52. {
  53. new MyFrame("窗口");
  54. }
  55. }

二、WindowAdapter适配器

当一个类实现一个接口时,即使不准备处理某个方法,也必须给出接口中所有方法的实现。适配器可以代替接口来处理事件,当Java提供处理事件的接口中多于一个方法时,Java相应地就提供一个适配器类,比如WindowAdapter类。适配器已经实现了相应的接口,例如WindowAdapter实现了WindowListener接口。因此,可以使用WindowAdapter的子类创建的对象做监视器,在子类中重写所需要的接口方法即可。

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. class MyFrame extends Frame
  4. { TextArea text;
  5. Boy police;
  6. MyFrame(String s)
  7. {super(s);
  8. police=new Boy(this);
  9. setBounds(100,100,200,300); setVisible(true);
  10. text=new TextArea(); add(text,BorderLayout.CENTER);
  11. addWindowListener(police);
  12. validate(); }
  13. }
  14. class Boy extends WindowAdapter
  15. {
  16. MyFrame f;
  17. public Boy(MyFrame f)
  18. { this.f=f; }
  19. public void windowActivated(WindowEvent e)
  20. { f.text.append("\n我被激活"); }
  21. public void windowClosing(WindowEvent e)
  22. { System.exit(0);
  23. }
  24. }
  25. class Example6_17
  26. {
  27. public static void main(String args[])
  28. {
  29. new MyFrame("窗口");
  30. }
  31. }

适配器经常这样使用:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. class MyFrame extends Frame
  4. { TextArea text;
  5. MyFrame(String s)
  6. { super(s);
  7. setBounds(100,100,200,300);setVisible(true);
  8. text=new TextArea(); add(text,BorderLayout.CENTER);
  9. addWindowListener( new WindowAdapter( )
  10. { public void windowActivated(WindowEvent e)
  11. { text.append("\n我被激活"); }
  12. public void windowClosing(WindowEvent e)
  13. { System.exit(0); }
  14. }
  15. );
  16. validate();
  17. }
  18. }

9.11 ItemEvent事件

例子 ----简单的计算器

  1. // Example.java
  2. public class Example {
  3. public static void main(String args[]) {
  4. WindowOperation win=new WindowOperation();
  5. win.setBounds(100,100,390,360);
  6. win.setTitle("简单计算器"); }
  7. }
  8. // ComputerListener.java
  9. import java.awt.event.*;
  10. import javax.swing.*;
  11. public class ComputerListener implements ActionListener {
  12. JTextField inputNumberOne,inputNumberTwo;
  13. JTextArea textShow;
  14. String fuhao;
  15. public void setJTextFieldOne(JTextField t) {
  16. inputNumberOne = t; }
  17. public void setJTextFieldTwo(JTextField t) {
  18. inputNumberTwo = t; }
  19. public void setJTextArea(JTextArea area) {
  20. textShow = area; }
  21. public void setFuhao(String s) {
  22. fuhao = s; }
  23. public void actionPerformed(ActionEvent e) {
  24. try {
  25. double number1=Double.parseDouble(inputNumberOne.getText());
  26. double number2=Double.parseDouble(inputNumberTwo.getText());
  27. double result = 0;
  28. if(fuhao.equals("+")) {
  29. result = number1+number2;
  30. }
  31. else if(fuhao.equals("-")) {
  32. result = number1-number2;
  33. }
  34. else if(fuhao.equals("*")) {
  35. result = number1*number2;
  36. }
  37. else if(fuhao.equals("/")) {
  38. result = number1/number2;
  39. }
  40. textShow.append(number1+" "+fuhao+" "+number2+" = "+result+"\n");
  41. }
  42. catch(Exception exp) {
  43. textShow.append("\n请输入数字字符\n");
  44. }
  45. }
  46. }
  47. // OperatorListener.java
  48. import java.awt.event.*;
  49. import javax.swing.*;
  50. public class OperatorListener implements ItemListener {
  51. JComboBox choice;
  52. ComputerListener workTogether;
  53. public void setJComboBox(JComboBox box) {
  54. choice = box; }
  55. public void setWorkTogether(ComputerListener computer) {
  56. workTogether = computer; }
  57. public void itemStateChanged(ItemEvent e) {
  58. String fuhao = choice.getSelectedItem().toString();
  59. workTogether.setFuhao(fuhao);
  60. }
  61. }
  62. // WindowOperation.java
  63. import java.awt.*;
  64. import javax.swing.*;
  65. import java.io.*;
  66. public class WindowOperation extends JFrame {
  67. JTextField inputNumberOne,inputNumberTwo;
  68. JComboBox choiceFuhao;
  69. JTextArea textShow;
  70. JButton button;
  71. OperatorListener operator; //监视ItemEvent事件的监视器
  72. ComputerListener computer; //监视ActionEvent事件的监视器
  73. public WindowOperation() {
  74. init();
  75. setVisible(true);
  76. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
  77. void init() {
  78. setLayout(new FlowLayout());
  79. inputNumberOne = new JTextField(5);
  80. inputNumberTwo = new JTextField(5);
  81. choiceFuhao = new JComboBox();
  82. button = new JButton("计算");
  83. choiceFuhao.addItem("选择运算符号:");
  84. String [] a = {"+","-","*","/"};
  85. for(int i=0;i<a.length;i++) {
  86. choiceFuhao.addItem(a[i]); }
  87. textShow = new JTextArea(9,30);
  88. operator = new OperatorListener();
  89. computer = new ComputerListener();
  90. operator.setJComboBox(choiceFuhao);
  91. operator.setWorkTogether(computer);
  92. computer.setJTextFieldOne(inputNumberOne);
  93. computer.setJTextFieldTwo(inputNumberTwo);
  94. computer.setJTextArea(textShow);
  95. choiceFuhao.addItemListener(operator);
  96. //choiceFuhao是事件源,operator是监视器
  97. button.addActionListener(computer);
  98. //button是事件源,computer是监视器
  99. add(inputNumberOne);
  100. add(choiceFuhao);
  101. add(inputNumberTwo);
  102. add(button);
  103. add(new JScrollPane(textShow));
  104. }
  105. }

9.12  鼠标事件

  1. public class Example
  2. { public static void main(String args[])
  3. {
  4. Frame f=new Frame();
  5. f.setBounds(100,100,300,300);
  6. f.setVisible(true);
  7. f.addWindowListener( new WindowAdapter( )
  8. {
  9. public void windowClosing(WindowEvent e)
  10. {
  11. System.exit(0);
  12. }
  13. } );
  14. f.setLayout(new FlowLayout());
  15. f.add(new MyCanvas()); //添加画布
  16. f.validate();
  17. }
  18. }
  19. import java.awt.*;
  20. import java.awt.event.*;
  21. class MyCanvas extends Canvas implements MouseListener
  22. { int left=-1,right=-1; //记录左、右键用的变量
  23. int x=-1,y=-1; //记录鼠标位置用的变量
  24. MyCanvas()
  25. { setSize(200,200);
  26. setBackground(Color.pink) ;
  27. addMouseListener(this); //监视画布上的鼠标事件
  28. }
  29. public void paint(Graphics g)
  30. { if (left==1)
  31. { g.drawString("按下了鼠标左键",x,y);
  32. }
  33. else if (right==1)
  34. { g.drawString("按下了鼠标右键",x,y);
  35. }
  36. }
  37. public void mouseReleased(MouseEvent e) { }
  38. public void mouseEntered(MouseEvent e) { }
  39. public void mouseClicked(MouseEvent e){ }
  40. public void mousePressed(MouseEvent e)
  41. { x=e.getX();
  42. y=e.getY();
  43. if (e.getModifiers()==InputEvent.BUTTON1_MASK)
  44. { left=1;
  45. right=-1;
  46. repaint(); }
  47. else if (e.getModifiers()==InputEvent.BUTTON3_MASK)
  48. { right=1;
  49. left=-1;
  50. repaint(); }
  51. }
  52. public void mouseExited(MouseEvent e)
  53. { left=-1;
  54. right=-1;
  55. repaint(); }
  56. public void update(Graphics g)
  57. { if (left==1||right==1) paint(g);
  58. else super.update(g);
  59. }
  60. }

二、使用MouseMotionListener接口处理鼠标事件

三、鼠标事件的转移

9.13  键盘事件

e.getSource()返回值是Object类型,所以必须强制类型转换

  1. public class E
  2. { public static void main(String args[ ])
  3. { Win win=new Win( ); }
  4. }
  5. import java.awt.*;
  6. import java.awt.event.*;
  7. class Win extends Frame implements KeyListener
  8. { Button b[ ]=new Button[8];
  9. int x,y;
  10. Win()
  11. { setLayout(new FlowLayout());
  12. for(int i=0;i<8;i++)
  13. {
  14. b[i]=new Button(""+i);
  15. b[i].addKeyListener(this);
  16. add(b[i]);
  17. }
  18. addWindowListener(new WindowAdapter()
  19. {
  20. public void windowClosing(WindowEvent e)
  21. {System.exit(0); }
  22. } );
  23. setBounds(10,10,300,300);
  24. setVisible(true);
  25. validate();
  26. }
  27. public void keyPressed(KeyEvent e)
  28. {Button button=(Button)e.getSource();
  29. x=button.getBounds().x;
  30. y=button.getBounds().y;
  31. if(e.getKeyCode()==KeyEvent.VK_UP)
  32. { y=y-2;
  33. if(y<=0) y=0;
  34. button.setLocation(x,y); }
  35. else if(e.getKeyCode()==KeyEvent.VK_DOWN)
  36. { y=y+2;
  37. if(y>=300) y=300;
  38. button.setLocation(x,y); }
  39. else if(e.getKeyCode()==KeyEvent.VK_LEFT)
  40. { x=x-2;
  41. if(x<=0) x=0;
  42. button.setLocation(x,y); }
  43. else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
  44. { x=x+2;
  45. if(x>=300) x=300;
  46. button.setLocation(x,y); } }
  47. public void keyTyped(KeyEvent e) { }
  48. public void keyReleased(KeyEvent e) { } }

二、处理复合键

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. class Win extends Frame implements KeyListener
  4. { Button b;
  5. Win( )
  6. {
  7. setLayout(new FlowLayout());
  8. b=new Button("我是一个按钮");
  9. b.addKeyListener(this);
  10. add(b);
  11. addWindowListener (new WindowAdapter()
  12. {
  13. public void windowClosing(WindowEvent e)
  14. {
  15. System.exit(0);
  16. }
  17. } );
  18. setBounds(10,10,300,300);
  19. setVisible(true);
  20. validate();
  21. }
  22. public void keyPressed(KeyEvent e)
  23. { Button button=(Button)e.getSource();
  24. int x=0,y=0,w=0,h=0;
  25. x=button.getBounds().x;
  26. y=button.getBounds().y;
  27. w=button.getBounds().width;
  28. h=button.getBounds().height;
  29. if ( e.getModifiers()==InputEvent.SHIFT_MASK &&
  30. e.getKeyCode()==KeyEvent.VK_X )
  31. { button.setLocation(y,x); }
  32. else if ( e.getModifiers()==InputEvent.CTRL_MASK&&
  33. e.getKeyCode()==KeyEvent.VK_X )
  34. { button.setSize(h,w); }
  35. }
  36. public void keyTyped(KeyEvent e) { }
  37. public void keyReleased(KeyEvent e) { }
  38. }
  39. public class E
  40. { public static void main(String args[ ])
  41. { Win win=new Win( ); }}

事件总结

9.14  Java Swing简介

  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. public class Example
  5. { public static void main(String args[ ])
  6. {
  7. JButton button1=new JButton("轻组件按钮1"),
  8. button2=new JButton("轻组件按钮2");
  9. JTextArea text=new JTextArea("轻组件");
  10. text.setLayout(new FlowLayout());
  11. button1.setOpaque(false);        //设置按钮透明
  12. text.add(button1);
  13. JFrame jframe=new JFrame("根窗体");
  14. jframe.setSize(300,300);
  15. jframe.setVisible(true);
  16. jframe.addWindowListener(new WindowAdapter()
  17. {public void windowClosing(WindowEvent e)
  18. {System.exit(0);}
  19. });
  20.   Container contentpane=jframe.getContentPane();        
  21.   contentpane.add(button2,BorderLayout.SOUTH);   
  22.   contentpane.add(text,BorderLayout.CENTER);
  23.   contentpane.validate();
  24. }
  25. }

二、JTree类

  1. import javax.swing.*;
  2. import javax.swing.tree.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. class Win extends JFrame
  6. {
  7. public Win( )
  8. {
  9. Container con=getContentPane();
  10. DefaultMutableTreeNode root=new DefaultMutableTreeNode("c:\\");
  11. DefaultMutableTreeNode t1=new DefaultMutableTreeNode("dos");
  12. DefaultMutableTreeNode t2=new DefaultMutableTreeNode("java");
  13. DefaultMutableTreeNode t1_1=new
  14. DefaultMutableTreeNode("applet");
  15. DefaultMutableTreeNode t1_2=new DefaultMutableTreeNode("jre");
  16. root.add(t1);
  17. root.add(t2);
  18. t1.add(t1_1);
  19. t1.add(t1_2);
  20. JTree tree =new JTree(root); //创建根为root的树
  21.  JScrollPane scrollpane=new JScrollPane(tree);
  22. con.add(scrollpane);
  23. addWindowListener ( new WindowAdapter( )
  24. {
  25. public void windowClosing(WindowEvent e)
  26. { System.exit(0);
  27.  }
  28.  } );
  29. setVisible(true);
  30. setBounds(80,80,300,300);
  31. con.validate( );
  32. validate( );
  33. }
  34. }
  35. public class Example
  36. { public static void main(String args[ ])
  37. {
  38. Win win=new Win( );
  39. }
  40. }

9.15 建立对话框

9.15.1 Dialog类

Dialog类和Frame都是Window的子类,二者有相似之处也有不同的地方。比如Dialog 没有添加菜单的功能,而且对话框必须要依赖于某个窗口或组件,当它所依赖的窗口或组件消失,对话框也将消失;而当它所依赖的窗口或组件可见时,对话框又会自动恢复。

1.Dialog类的主要方法

  1. import java.awt.event.*; import java.awt.*;
  2. class MyDialog extends Dialog implements ActionListener //建立对话框类
  3. { static final int YES=1,NO=0;
  4. int message=-1; Button yes,no;
  5. MyDialog(Frame f,String s,boolean b) //构造方法
  6. { super(f,s,b);
  7. yes=new Button("Yes"); yes.addActionListener(this);
  8. no=new Button("No"); no.addActionListener(this);
  9. setLayout(new FlowLayout());
  10. add(yes); add(no);
  11. setBounds(60,60,100,100);
  12. addWindowListener(new WindowAdapter()
  13. { public void windowClosing(WindowEvent e)
  14. { message=-1;setVisible(false);} });
  15. }
  16. public void actionPerformed(ActionEvent e)
  17. { if(e.getSource()==yes)
  18. { message=YES;setVisible(false); }
  19. else if(e.getSource()==no)
  20. { message=NO;setVisible(false); }
  21. }
  22. public int getMessage()
  23. { return message;
  24. }
  25. }
  26. class Dwindow extends Frame implements ActionListener
  27. { TextArea text; Button button; MyDialog dialog;
  28. Dwindow(String s)
  29. { super(s);
  30. text=new TextArea(5,22); button=new Button("打开对话框");
  31. button.addActionListener(this);
  32. setLayout(new FlowLayout());
  33. add(button); add(text);
  34. dialog=new MyDialog(this,"我有模式",true);
  35. setBounds(60,60,300,300); setVisible(true);
  36. validate();
  37. addWindowListener(new WindowAdapter()
  38. { public void windowClosing(WindowEvent e)
  39. { System.exit(0);} });
  40. }
  41. public void actionPerformed(ActionEvent e)
  42. { if(e.getSource()==button)
  43. { dialog.setVisible(true);
  44. if(dialog.getMessage()==MyDialog.YES)
  45. text.append("\n你单击了对话框的yes按钮");
  46. else if(dialog.getMessage()==MyDialog.NO)
  47. text.append("\n你单击了对话框的No按钮");
  48. }
  49. }
  50. }
  51. public class Example
  52. { public static void main(String args[])
  53. { new Dwindow("带对话框的窗口");
  54. }
  55. }

2.对话框的模式

对话框分为无模式和有模式两种。

如果一个对话框是有模式的对话框,那么当这个对话框处于激活状态时,只让程序响应对话框内部的事件,程序不能再激活它所依赖的窗口或组件,而且它将堵塞当前线程的执行,即堵塞使得对话框处于激活状态的线程,直到该对话框消失不可见。

无模式对话框处于激活状态时,程序仍能激活它所依赖的窗口或组件,它也不堵塞线程的执行。

9.15.2文件对话框

FileDialog是Dialog类的子类,它创建的对象称为文件对话框。文件对话框是一个打开文件和保存文件的有模式对话框。文件对话框必须依附一个Frame对象。

FileDialog类主要方法

  1. import java.awt.*; import java.awt.event.*;
  2. public class Example
  3. { public static void main(String args[])
  4. { FWindow f=new FWindow("窗口"); } }
  5. class FWindow extends Frame implements ActionListener
  6. { FileDialog filedialog_save, filedialog_load; //声明2个文件对话框
  7. MenuBar menubar; Menu menu; MenuItem itemSave,itemLoad;
  8. TextArea text;
  9. FWindow(String s)
  10. { super(s); setSize(300,400); setVisible(true);
  11. text=new TextArea(10,10); add(text,"Center"); validate();
  12. menubar=new MenuBar(); menu=new Menu("文件");
  13. itemSave=new MenuItem("保存文件"); itemLoad=new MenuItem("打开文件");
  14. itemSave.addActionListener(this); itemLoad.addActionListener(this);
  15. menu.add(itemSave); menu.add(itemLoad);
  16. menubar.add(menu); setMenuBar(menubar);
  17. filedialog_save=new FileDialog(this,"保存文件话框",FileDialog.SAVE);
  18. filedialog_save.setVisible(false);
  19. filedialog_load=new FileDialog(this,"打开文件话框",FileDialog.LOAD);
  20. filedialog_load.setVisible(false);
  21. filedialog_save.addWindowListener(new WindowAdapter()//对话框增加适配器
  22. { public void windowClosing(WindowEvent e)
  23. { filedialog_save.setVisible(false); } });
  24. filedialog_load.addWindowListener(new WindowAdapter()//对话框增加适配器
  25. {public void windowClosing(WindowEvent e)
  26. { filedialog_load.setVisible(false); } });
  27. addWindowListener(new WindowAdapter() //窗口增加适配器
  28. {public void windowClosing(WindowEvent e)
  29. { setVisible(false);System.exit(0); } });
  30. }
  31. public void actionPerformed(ActionEvent e) //实现接口中的方法
  32. { if(e.getSource()==itemSave)
  33. { filedialog_save.setVisible(true);
  34. String name=filedialog_save.getFile();
  35. if(name!=null)
  36. { text.setText("你选择了保存文件,名字是"+name); }
  37. else
  38. { text.setText("没有保存文件"); } }
  39. else if(e.getSource()==itemLoad)
  40. { filedialog_load.setVisible(true);
  41. String name=filedialog_load.getFile();
  42. if(name!=null)
  43. { text.setText("你选择了打开文件,名字是"+name); }
  44. else
  45. { text.setText("没有打开文件"); } }
  46. }
  47. }

9.15.3消息对话框

9.15.4确认对话框

9.15.5颜色对话框

  1. import java.awt.event.*;
  2. import java.awt.*;
  3. import javax.swing.JColorChooser;
  4. class Dwindow extends Frame implements ActionListener
  5. { Button button;
  6. Dwindow(String s)
  7. { super(s);
  8. button=new Button("打开颜色对话框");
  9. button.addActionListener(this);
  10. setLayout(new FlowLayout());
  11. add(button);
  12. setBounds(60,60,300,300);
  13. setVisible(true); validate();
  14. addWindowListener(new WindowAdapter()
  15. { public void windowClosing(WindowEvent e)
  16. { System.exit(0);} } );
  17. }
  18. public void actionPerformed(ActionEvent e)
  19. { Color newColor=JColorChooser.showDialog(this,"调色板",button.getBackground());
  20. button.setBackground(newColor); }
  21. }
  22. public class HelloWorld
  23. { public static void main(String args[])
  24. { new Dwindow("带颜色对话框的窗口"); }}
(0)

相关推荐