当前位置: 代码迷 >> 综合 >> 《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理
  详细解决方案

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

热度:60   发布时间:2023-10-01 10:51:05.0

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

本章内容

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.1  Java窗口

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

实例方法:

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import javax.swing.*;
import java.awt.*;
public class Example {public static void main(String args[]) {JFrame window1=new JFrame("第一个窗口");JFrame window2=new JFrame("第二个窗口");window1.setBounds(60,100,188,108);window2.setBounds(260,100,188,108);window1.setVisible(true);window1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);window2.setVisible(true);window2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

2. JMenu 菜单

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

3. JMenuItem 菜单项

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

4. 嵌入子菜单

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
class FirstWindow extends Frame  
{  MenuBar menubar;Menu menu;MenuItem  item1,item2; FirstWindow(String s) {  super(s);        setSize(160,170);setLocation(120,120);setVisible(true);               menubar=new MenuBar(); menu=new Menu("文件"); item1=new MenuItem();item2=new MenuItem("保存");          menu.add(item1);menu.add(item2);menubar.add(menu);setMenuBar(menubar);      } }
public class Example6_1
{  public static void        main(String args[]){ FirstWindow win=new FirstWindow("一个简单的窗口");}} 

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

 MenuBar menubar=new MenuBar();Menu fileM=new Menu("File");Menu editM=new Menu("Edit");Menu toolsM=new Menu("Tools");Menu helpM=new Menu("Help");MenuItem fileM1=new MenuItem("New");MenuItem fileM2=new MenuItem("Open");MenuItem fileM3=new MenuItem("Save");Menu fileM4=new Menu("Print");CheckboxMenuItem fileM5=new CheckboxMenuItem("Quit",true);MenuItem printM=new MenuItem("Preview");MenuItem setM=new MenuItem("Setting");menubar.add(fileM);menubar.add(editM);menubar.add(toolsM);menubar.add(helpM); fileM.add(fileM1);  fileM.add(fileM2);  fileM.add(fileM3);  fileM.add(fileM4);fileM.addSeparator();fileM4.add(printM);  fileM4.add(setM);fileM.add(fileM5);

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

//Example.java
public class Example {public static void main(String args[]) {WindowMenu win=new WindowMenu("带菜单的窗口",20,30,200,190);}
}//WindowMenu.java
import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class WindowMenu extends JFrame {JMenuBar menubar;JMenu menu,subMenu;JMenuItem  itemLiterature,itemCooking;public WindowMenu(){} public WindowMenu(String s,int x,int y,int w,int h) {init(s);setLocation(x,y);setSize(w,h);setVisible(true);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); }
void init(String s){setTitle(s);             menubar=new JMenuBar(); menu=new JMenu("菜单"); subMenu=new JMenu("体育话题");  itemLiterature=new JMenuItem("文学话题",new ImageIcon("a.gif"));itemCooking=new JMenuItem("烹饪话题",new ImageIcon("b.gif"));itemLiterature.setAccelerator(KeyStroke.getKeyStroke('A')); itemCooking.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK)); menu.add(itemLiterature); menu.addSeparator(); menu.add(itemCooking); subMenu.add( new JMenuItem( "足球",new ImageIcon("c.gif") ) ); subMenu.add(new JMenuItem("篮球",new ImageIcon("d.gif")));menu.add(subMenu); menubar.add(menu); setJMenuBar(menubar);} 
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.2  文本框组件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

其它常用实例方法:

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
class WindowText extends Frame 
{ TextField text1,text2;WindowText(String s) { super(s);setLayout(new FlowLayout());setBounds(100,100,150,150);setVisible(true);text1=new TextField("输入密码:",10); text1.setEditable(false);text2=new TextField(10);text2.setEchoChar('*');add(text1);add(text2);validate();}
}
class Example
{public static void main(String args[]){ WindowText win=new WindowText("窗口");}}

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

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

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

二、TextField上的ActionEvent事件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

3.处理事件的接口

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

4.ActionEvent类中的方法

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

方法一:

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;
class MyWindow extends Frame implements ActionListener
{ TextField text1,text2,text3; MyWindow(String s) { super(s);setLayout(new FlowLayout());text1=new TextField(10);text2=new TextField(10);text3=new TextField(10);  text2.setEditable(false);text3.setEditable(false);add(text1);add(text2);add(text3);text1.addActionListener(this);     setBounds(100,100,150,150);setVisible(true);validate();}public void actionPerformed(ActionEvent e) { int n=0;try{n=Integer.parseInt(text1.getText());text2.setText(n+"的平方是:"+n*n);text3.setText(n+"的立方是:"+n*n*n);}catch(NumberFormatException ee){text1.setText("请输入数字字符");}             }}
class actionDemo
{    public static void main(String args[]){      new MyWindow("窗口");     }}

方法二:

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

class actionDemo
{public static void main(String args[]){ new MyWindow("窗口");}}
import java.awt.*;
import java.awt.event.*;
class MyWindow extends Frame
{   TextField  text1,text2,text3;PoliceMan_2 police_2=new PoliceMan_2(this);PoliceMan_3 police_3=new PoliceMan_3(this); MyWindow(String s) { super(s);setLayout(new FlowLayout());text1=new TextField(20);text2=new TextField(20);text2.setEditable(false);text3=new TextField(20);text3.setEditable(false);  add(text1);  add(text2);   add(text3);text1.addActionListener(police_2);text1.addActionListener(police_3);setBounds(100,100,300,150);setVisible(true);validate();}    }
class PoliceMan_2 implements ActionListener 
{  MyWindow win;PoliceMan_2(MyWindow a){win=a; }public void actionPerformed(ActionEvent e) { int n=0,m=0;try{n=Integer.parseInt(win.text1.getText());m=n*n;win.text2.setText(n+"的平方是:"+m);}catch(Exception ee){win.text1.setText("请输入数字字符");}}}
class PoliceMan_3 implements ActionListener 
{  MyWindow win;PoliceMan_3(MyWindow a){win=a; }public void actionPerformed(ActionEvent e) { int n=0,m=0;try{n=Integer.parseInt(win.text1.getText());m=n*n*n;win.text3.setText(n+"的立方是:"+m);}catch(Exception ee){win.text1.setText("请输入数字字符");}}}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.3  标签

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.4  按钮组件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

二、Button上的ActionEvent事件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;
class WindowButton extends Frame implements ActionListener
{  int number;TextField 提示条,输入框;Button nuttonGetNumber,buttonEnter;   WindowButton(String s) {  super(s);setLayout(new FlowLayout());nuttonGetNumber=new Button("得到一个随机数");提示条=new TextField("输入你的猜测:",10);提示条.setEditable(false);输入框=new TextField("0",10); buttonEnter=new Button("确定"); add(nuttonGetNumber); add(提示条); add(输入框);add(buttonEnter); buttonEnter.addActionListener(this);nuttonGetNumber.addActionListener(this);setBounds(100,100,200,200);setVisible(true);validate();}   
public void actionPerformed(ActionEvent e) 
{ if(e.getSource()==nuttonGetNumber){ number=(int)(Math.random()*100)+1;提示条.setText("输入你的猜测:");}else if(e.getSource()==buttonEnter){ int guess;try { guess=Integer.parseInt(输入框.getText());if(guess==number){ 提示条.setText("猜对了!");}else if(guess>number){ 提示条.setText("猜大了!");输入框.setText(null); }else if(guess<number){ 提示条.setText("猜小了!");输入框.setText(null); }}catch(NumberFormatException event){  提示条.setText("请输入数字字符");} }} 
}class Example6_7
{public static void main(String args[]){ new WindowButton("窗口");}}

输出结果:

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.5  面板

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;
public class Example6_10
{public static void main(String args[]){new  WindowPanel(); }}
class Mypanel extends Panel implements ActionListener
{  Button  button;Label   lab;   Mypanel( )  { lab=new Label("单击按钮关闭程序");button=new Button("关闭程序");add(lab);add(button);button.addActionListener(this);setBackground(Color.pink);                   //设置面板的底色}public void actionPerformed(ActionEvent e){System.exit(0);}
}
class WindowPanel extends Frame 
{  Mypanel panel1,panel2;Button button;WindowPanel( ){ setLayout(new FlowLayout());panel1=new Mypanel();panel2=new Mypanel();button=new Button("我不在那些面板里");add(panel1);add(panel2);add(button);setBounds(120,125,200,200);setVisible(true);validate();      }
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.6  Component类的常用方法

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

二、组件的大小与位置

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

三、组件的激活与可见性

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

四、组件的字体

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

9.7  布局

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
class WindowFlow extends Frame 
{ WindowFlow(String s) { super(s);setBounds(100,100,400,320);setVisible(true);FlowLayout flow=new FlowLayout();flow.setAlignment(FlowLayout.LEFT);flow.setHgap(2);flow.setVgap(8);setLayout(flow);for(int i=1;i<=10;i++) {     add(new Button("i am "+i));    }validate();}
}
class Example
{  public static void main(String args[]){     WindowFlow win=new WindowFlow("FlowLayout布局窗口");}
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

二、BorderLayout布局

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*; 
class Example6_3
{ public static void main(String args[]){ Frame win=new Frame("窗体"); BorderLayout border=new BorderLayout();win.setLayout(border);win.setBounds(100,100,300,300);win.setVisible(true);Button bSouth=new Button("我在南边"),bNorth=new Button("我在北边"),bEast =new Button("我在东边"),bWest =new Button("我在西边"),bCenter=new Button("我在中心");win.add(bNorth,BorderLayout.NORTH);win.add(bSouth,BorderLayout.SOUTH);win.add(bEast,BorderLayout.EAST);win.add(bWest,BorderLayout.WEST); win.add(bCenter,BorderLayout.CENTER);win.validate();}}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

三、CardLayout布局

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
class WindowFlow extends Frame 
{  WindowFlow(String s) { super(s);            setBounds(100,100,150,120);setVisible(true);CardLayout  card=new  CardLayout();setLayout(card);String str="a";      add(str,new Button("button1"));    card.show(this,str);      validate();}}
class Example6_4
{public static void main(String args[]){ WindowFlow win=new WindowFlow("CardLayout布局窗口");}
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

四、GridLayout布局

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
class WindowFlow extends Frame 
{  WindowFlow(String s) { super(s);            setBounds(100,100,150,120);setVisible(true);GridLayout grid=new GridLayout(3,2);setLayout(grid);for(int i=1;i<7;i++)add(new Button("button"+i));validate();}
}
class Example6_5
{public static void main(String args[]){ new WindowFlow("GridLayout布局窗口");}}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

五、BoxLayout布局

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import javax.swing.*; 
import javax.swing.border.*;
import java.awt.*;
class WindowBox extends Frame 
{  WindowBox(String s){ Frame frame=new Frame(s);frame.setBounds(120,125,200,200);frame.setVisible(true);BoxLayout box=new BoxLayout(frame,BoxLayout.Y_AXIS);frame.setLayout(box);frame.add(new Button("button1")); frame.add(new Button("button2")); frame.add(new Button("button3")); frame.add(new Button("button4")); frame.validate();      }
}
public class Example6_7
{    public static void main(String args[]){      new WindowBox("盒式布局");      }}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

Box类中的静态方法:

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
class WindowBox extends Frame 
{   Box baseBox ,boxV1,boxV2; WindowBox(){ setLayout(new FlowLayout());setBounds(120,125,200,200);setVisible(true);boxV1=Box.createVerticalBox();boxV1.add(new Label("输入您的姓名"));boxV1.add(Box.createVerticalStrut(8));boxV1.add(new Label("输入email"));boxV1.add(Box.createVerticalStrut(8));boxV1.add(new Label("输入您的职业"));boxV2=Box.createVerticalBox();boxV2.add(new TextField(16));boxV2.add(Box.createVerticalStrut(8));boxV2.add(new TextField(16));boxV2.add(Box.createVerticalStrut(8));boxV2.add(new TextField(16)); baseBox=Box.createHorizontalBox();baseBox.add(boxV1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(boxV2);      add(baseBox); validate();      }
} 
public class Example6_8
{public static void main(String args[]){new WindowBox(); }
}

六、null布局

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.8  文本区组件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

class Example
{  public static void main(String args[]){    WindowTextArea win=new WindowTextArea("窗口");   }
}
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class WindowTextArea extends Frame implements TextListener
{ TextArea text1,text2;WindowTextArea(String s) { super(s);setLayout(new FlowLayout());text1=new TextArea(6,15);text2=new TextArea(6,15);add(text1);add(text2); text2.setEditable(false);text1.addTextListener(this) ;setBounds(100,100,150,150);setVisible(true);validate();}public void textValueChanged(TextEvent e) { if(e.getSource()==text1) {  String s=text1.getText(); StringTokenizer fenxi=new StringTokenizer(s," ,'\n' ");int n=fenxi.countTokens();String a[]=new String[n]; for(int i=0;i<=n-1;i++) {String temp=fenxi.nextToken();  a[i]=temp;}Arrays.sort(a);           //按字典序从小到大排序text2.setText(null);   //刷新显示for(int i=0;i<n;i++) {  text2.append(a[i]+"\n");}}}}

二、TextArea上的TextEvent事件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.9  画布

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;
public class Example6_10
{public static void main(String args[]){new WindowCanvas(); }
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

class Mycanvas extends Canvas 
{  Mycanvas() { setSize(100,100);                           //设置画布的初始大小 setBackground(Color.cyan); }     //设置画布的背景色public void paint(Graphics g){g.setColor(Color.orange); g.fillOval(12,12,45,60); }                 //在画布上绘制椭圆
}
class WindowCanvas extends Frame 
{  Mycanvas canvas;WindowCanvas(){canvas=new Mycanvas( );setLayout(new FlowLayout());add(canvas);setBounds(120,125,580,300);setBackground(Color.pink);      //设置窗口的背景色setVisible(true);validate();addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}}  );           }} 

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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  窗口事件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;
class MyFrame extends Frame implements WindowListener 
{ TextArea text;MyFrame(String s){ super(s);setBounds(100,100,200,300);setVisible(true);text=new TextArea();add(text,BorderLayout.CENTER); addWindowListener(this);validate();} public void windowActivated(WindowEvent e){ text.append("\n我被激活");validate();}public void windowDeactivated(WindowEvent e){  text.append("\n我不是激活状态了");setBounds(0,0,400,400); validate();}public void windowClosing(WindowEvent e){ System.out.println("\n窗口正在关闭呢");dispose();}public void windowClosed(WindowEvent e){  System.out.println("程序结束运行"); System.exit(0);}public void windowIconified(WindowEvent e){  text.append("\n我图标化了");}public void windowDeiconified(WindowEvent e){  text.append("\n我撤消图标化"); setBounds(0,0,400,400);validate();}public void windowOpened(WindowEvent e)  { }
}
class Example6_16
{   public static void main(String args[]){ new MyFrame("窗口");}
}

二、WindowAdapter适配器

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;	
class MyFrame extends Frame 
{  TextArea text;  Boy police;MyFrame(String s){super(s);police=new Boy(this);setBounds(100,100,200,300); setVisible(true);text=new TextArea(); add(text,BorderLayout.CENTER);addWindowListener(police); validate();    } }
class Boy extends WindowAdapter 
{ MyFrame f;public Boy(MyFrame f){      this.f=f;     }public void windowActivated(WindowEvent e) {        f.text.append("\n我被激活");     }public void windowClosing(WindowEvent e){        System.exit(0);}}
class Example6_17
{  public static void main(String args[]){ new MyFrame("窗口");} }

适配器经常这样使用:

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;
class MyFrame extends Frame 
{  TextArea text;MyFrame(String s) { super(s);setBounds(100,100,200,300);setVisible(true);text=new TextArea(); add(text,BorderLayout.CENTER);addWindowListener(   new WindowAdapter( ) {   public void windowActivated(WindowEvent e){ text.append("\n我被激活"); }public void windowClosing(WindowEvent e){  System.exit(0); }});validate();}
}

9.11 ItemEvent事件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

// Example.java
public class Example {public static void main(String args[]) {WindowOperation win=new WindowOperation();win.setBounds(100,100,390,360);win.setTitle("简单计算器");   }
}// ComputerListener.java
import java.awt.event.*;
import javax.swing.*;
public class ComputerListener implements ActionListener {JTextField inputNumberOne,inputNumberTwo; JTextArea textShow;String fuhao;public void setJTextFieldOne(JTextField t) {inputNumberOne = t;   }public void setJTextFieldTwo(JTextField t) {inputNumberTwo = t;   }public void setJTextArea(JTextArea area) {textShow = area;   }public void setFuhao(String s) {fuhao = s;   }
public void actionPerformed(ActionEvent e) {try {double number1=Double.parseDouble(inputNumberOne.getText());double number2=Double.parseDouble(inputNumberTwo.getText());double result = 0;if(fuhao.equals("+")) {result = number1+number2;}else if(fuhao.equals("-")) {result = number1-number2;}else if(fuhao.equals("*")) {result = number1*number2;}else if(fuhao.equals("/")) {result = number1/number2;}textShow.append(number1+" "+fuhao+" "+number2+" = "+result+"\n");}catch(Exception exp) {textShow.append("\n请输入数字字符\n");}         }
}
// OperatorListener.java
import java.awt.event.*;
import javax.swing.*;
public class OperatorListener implements ItemListener {JComboBox choice;ComputerListener workTogether;public void setJComboBox(JComboBox box) {choice = box;   }public void setWorkTogether(ComputerListener computer) {workTogether = computer;   }public void itemStateChanged(ItemEvent e)  {String fuhao = choice.getSelectedItem().toString();workTogether.setFuhao(fuhao);}
}
// WindowOperation.java
import java.awt.*;
import javax.swing.*;
import java.io.*;
public class WindowOperation extends JFrame {JTextField inputNumberOne,inputNumberTwo; JComboBox choiceFuhao;JTextArea textShow;JButton button;OperatorListener operator;  //监视ItemEvent事件的监视器ComputerListener computer;  //监视ActionEvent事件的监视器public WindowOperation() {init();setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   }void init() {setLayout(new FlowLayout());inputNumberOne = new JTextField(5);inputNumberTwo = new JTextField(5);choiceFuhao = new JComboBox();button = new JButton("计算"); choiceFuhao.addItem("选择运算符号:");
String [] a = {"+","-","*","/"};for(int i=0;i<a.length;i++) {choiceFuhao.addItem(a[i]);      }textShow = new JTextArea(9,30);operator = new OperatorListener();computer = new ComputerListener();operator.setJComboBox(choiceFuhao);operator.setWorkTogether(computer);computer.setJTextFieldOne(inputNumberOne);computer.setJTextFieldTwo(inputNumberTwo);computer.setJTextArea(textShow);choiceFuhao.addItemListener(operator);  //choiceFuhao是事件源,operator是监视器button.addActionListener(computer);    //button是事件源,computer是监视器add(inputNumberOne);add(choiceFuhao);add(inputNumberTwo);add(button);add(new JScrollPane(textShow));}
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.12  鼠标事件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

public class Example
{  public static void main(String args[]){ Frame f=new Frame();f.setBounds(100,100,300,300);f.setVisible(true);f.addWindowListener(  new WindowAdapter( )  {public void windowClosing(WindowEvent e){System.exit(0);}} );f.setLayout(new FlowLayout());f.add(new MyCanvas());                 //添加画布f.validate();    }
}
import java.awt.*;
import java.awt.event.*;
class MyCanvas extends Canvas implements MouseListener
{   int left=-1,right=-1;                    //记录左、右键用的变量 int x=-1,y=-1;                              //记录鼠标位置用的变量MyCanvas(){ setSize(200,200);setBackground(Color.pink) ;addMouseListener(this);         //监视画布上的鼠标事件}   public void paint(Graphics g){  if (left==1){ g.drawString("按下了鼠标左键",x,y);}else if (right==1){ g.drawString("按下了鼠标右键",x,y);}}public void mouseReleased(MouseEvent e) {  }public void mouseEntered(MouseEvent e) {  } public void mouseClicked(MouseEvent e){ }  public void mousePressed(MouseEvent e){  x=e.getX();y=e.getY();if (e.getModifiers()==InputEvent.BUTTON1_MASK){  left=1;right=-1;repaint();        }else if (e.getModifiers()==InputEvent.BUTTON3_MASK){  right=1; left=-1;repaint();         }} public void mouseExited(MouseEvent e){ left=-1;right=-1;repaint();    }
public void update(Graphics g){ if (left==1||right==1)   paint(g);else          super.update(g);}
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

三、鼠标事件的转移

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.13  键盘事件

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

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

public class E
{  public static void main(String args[ ]){        Win win=new Win( );     }
}
import java.awt.*;
import java.awt.event.*;
class Win extends Frame implements KeyListener
{  Button b[ ]=new Button[8];int x,y;Win(){ setLayout(new FlowLayout());for(int i=0;i<8;i++) { b[i]=new Button(""+i);b[i].addKeyListener(this);add(b[i]);}addWindowListener(new WindowAdapter(){   public void windowClosing(WindowEvent e){System.exit(0); }}  );setBounds(10,10,300,300);setVisible(true); validate();}  public void keyPressed(KeyEvent e){Button button=(Button)e.getSource();x=button.getBounds().x;y=button.getBounds().y;if(e.getKeyCode()==KeyEvent.VK_UP){  y=y-2;if(y<=0) y=0;button.setLocation(x,y);        }else if(e.getKeyCode()==KeyEvent.VK_DOWN){  y=y+2;if(y>=300) y=300; button.setLocation(x,y);        }else if(e.getKeyCode()==KeyEvent.VK_LEFT){ x=x-2;if(x<=0) x=0;button.setLocation(x,y);        } else if(e.getKeyCode()==KeyEvent.VK_RIGHT){  x=x+2;if(x>=300) x=300;button.setLocation(x,y);        }    }public void keyTyped(KeyEvent e) { }public void keyReleased(KeyEvent e) { }  }

二、处理复合键

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;
import java.awt.event.*;
class Win extends Frame implements KeyListener
{   Button b;Win( ){ setLayout(new FlowLayout());b=new Button("我是一个按钮");b.addKeyListener(this);add(b);addWindowListener (new WindowAdapter(){   public void windowClosing(WindowEvent e){ System.exit(0);}} );setBounds(10,10,300,300);setVisible(true); validate();}public void keyPressed(KeyEvent e){ Button button=(Button)e.getSource();int x=0,y=0,w=0,h=0;x=button.getBounds().x;y=button.getBounds().y;w=button.getBounds().width;h=button.getBounds().height;if ( e.getModifiers()==InputEvent.SHIFT_MASK  &&e.getKeyCode()==KeyEvent.VK_X ){ button.setLocation(y,x);   }else if ( e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==KeyEvent.VK_X ){ button.setSize(h,w);       }}public void keyTyped(KeyEvent e) { }public void keyReleased(KeyEvent e) { }}
public class E
{  public static void main(String args[ ]){        Win win=new Win( );    }}

事件总结

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.14  Java Swing简介

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Example
{  public static void main(String args[ ]){  JButton button1=new JButton("轻组件按钮1"),button2=new JButton("轻组件按钮2");JTextArea text=new JTextArea("轻组件");text.setLayout(new FlowLayout());button1.setOpaque(false);              //设置按钮透明text.add(button1);      JFrame  jframe=new JFrame("根窗体");jframe.setSize(300,300);jframe.setVisible(true);jframe.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);} });Container contentpane=jframe.getContentPane();        contentpane.add(button2,BorderLayout.SOUTH);   contentpane.add(text,BorderLayout.CENTER);contentpane.validate();} 
}

二、JTree类

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import javax.swing.*; 
import javax.swing.tree.*;	
import java.awt.*;
import java.awt.event.*;
class Win extends JFrame
{ public Win( ){Container con=getContentPane();DefaultMutableTreeNode root=new DefaultMutableTreeNode("c:\\");DefaultMutableTreeNode t1=new DefaultMutableTreeNode("dos"); DefaultMutableTreeNode t2=new DefaultMutableTreeNode("java");DefaultMutableTreeNode t1_1=new     DefaultMutableTreeNode("applet");DefaultMutableTreeNode t1_2=new DefaultMutableTreeNode("jre");root.add(t1);root.add(t2);t1.add(t1_1);t1.add(t1_2);JTree tree =new JTree(root);    //创建根为root的树JScrollPane scrollpane=new JScrollPane(tree);con.add(scrollpane);addWindowListener ( new WindowAdapter( ){ public void windowClosing(WindowEvent e){ System.exit(0);} } );setVisible(true);setBounds(80,80,300,300);con.validate( );validate( );}
}
public class Example
{  public static void main(String args[ ]){Win win=new Win( ); } 
}

9.15 建立对话框

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.15.1 Dialog类

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

1.Dialog类的主要方法

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.event.*; import java.awt.*;
class MyDialog extends Dialog implements ActionListener  //建立对话框类
{  static final int YES=1,NO=0;int message=-1; Button yes,no;MyDialog(Frame f,String s,boolean b) //构造方法{  super(f,s,b);yes=new Button("Yes"); yes.addActionListener(this);no=new Button("No");   no.addActionListener(this);setLayout(new FlowLayout());add(yes); add(no);setBounds(60,60,100,100);addWindowListener(new WindowAdapter(){   public void windowClosing(WindowEvent e){ message=-1;setVisible(false);} });}public void actionPerformed(ActionEvent e){  if(e.getSource()==yes) { message=YES;setVisible(false);      }else if(e.getSource()==no){ message=NO;setVisible(false);      }}public int getMessage(){  return message;}
}
class Dwindow extends Frame implements ActionListener 
{  TextArea text; Button button; MyDialog dialog;Dwindow(String s){  super(s);text=new TextArea(5,22); button=new Button("打开对话框"); button.addActionListener(this);setLayout(new FlowLayout());add(button); add(text); dialog=new MyDialog(this,"我有模式",true);setBounds(60,60,300,300); setVisible(true);validate();addWindowListener(new WindowAdapter(){   public void windowClosing(WindowEvent e){ System.exit(0);} });}public void actionPerformed(ActionEvent e){  if(e.getSource()==button){  dialog.setVisible(true); if(dialog.getMessage()==MyDialog.YES) text.append("\n你单击了对话框的yes按钮"); else if(dialog.getMessage()==MyDialog.NO)text.append("\n你单击了对话框的No按钮");            }}
}
public class Example
{  public static void main(String args[]){  new Dwindow("带对话框的窗口");}
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

2.对话框的模式

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

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

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

9.15.2文件对话框

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

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

FileDialog类主要方法

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.*;  import java.awt.event.*;
public class Example
{  public static void main(String args[]){  FWindow f=new FWindow("窗口");    } }
class  FWindow extends Frame implements ActionListener
{  FileDialog filedialog_save, filedialog_load; //声明2个文件对话框MenuBar menubar;   Menu menu;   MenuItem itemSave,itemLoad;TextArea text;FWindow(String s){  super(s); setSize(300,400); setVisible(true); text=new TextArea(10,10); add(text,"Center"); validate(); menubar=new MenuBar(); menu=new Menu("文件"); itemSave=new MenuItem("保存文件"); itemLoad=new MenuItem("打开文件"); itemSave.addActionListener(this); itemLoad.addActionListener(this);menu.add(itemSave);     menu.add(itemLoad); menubar.add(menu);      setMenuBar(menubar);filedialog_save=new FileDialog(this,"保存文件话框",FileDialog.SAVE);filedialog_save.setVisible(false);filedialog_load=new FileDialog(this,"打开文件话框",FileDialog.LOAD);filedialog_load.setVisible(false);filedialog_save.addWindowListener(new WindowAdapter()//对话框增加适配器{  public void windowClosing(WindowEvent e){  filedialog_save.setVisible(false);                   }              });filedialog_load.addWindowListener(new WindowAdapter()//对话框增加适配器{public void windowClosing(WindowEvent e){ filedialog_load.setVisible(false);                   }             });addWindowListener(new WindowAdapter()  //窗口增加适配器{public void windowClosing(WindowEvent e){ setVisible(false);System.exit(0);                  }            });}
public void actionPerformed(ActionEvent e) //实现接口中的方法{  if(e.getSource()==itemSave){  filedialog_save.setVisible(true);String name=filedialog_save.getFile();if(name!=null){  text.setText("你选择了保存文件,名字是"+name);              }      else{   text.setText("没有保存文件");              }         }else if(e.getSource()==itemLoad){  filedialog_load.setVisible(true);String name=filedialog_load.getFile();if(name!=null){  text.setText("你选择了打开文件,名字是"+name);             }      else{   text.setText("没有打开文件");            }        }}
}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.15.3消息对话框

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.15.4确认对话框

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

9.15.5颜色对话框

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

import java.awt.event.*;
import java.awt.*;
import javax.swing.JColorChooser;
class Dwindow extends Frame implements ActionListener 
{  Button button;Dwindow(String s){  super(s);button=new Button("打开颜色对话框"); button.addActionListener(this);setLayout(new FlowLayout());add(button);setBounds(60,60,300,300);setVisible(true); validate();addWindowListener(new WindowAdapter(){   public void windowClosing(WindowEvent e){ System.exit(0);} } );}public void actionPerformed(ActionEvent e){ Color newColor=JColorChooser.showDialog(this,"调色板",button.getBackground());button.setBackground(newColor); }
}
public class HelloWorld
{  public static void main(String args[]){   new Dwindow("带颜色对话框的窗口");   }}

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

《Java 2 实用教程》课程学习(9)——第9章 组件及事件处理

  相关解决方案