GraphicalUser Interface:图形用户接口。AWT:抽象窗口接口,调用系统方法实现;Swing:图形界面组件系统,Java自身实现。
一. AWT的继承关系:
二. 常用布局管理器:
FlowLayout(流布局)
从左到右的顺序排列,单个组件默认居中。Panel默认此布局
BorderLayout(边界布局)
东西南北中,当不指定方位时,默认最大化填充。Frame默认此布局
GridLayout(网格布局)
规则布局
GardLayout(卡片布局)
选项卡
GridBagLayout(网格包布局)
非规则矩阵
三. 界面创建流程:
1)创建容器
Window、Frame、Panel . . .
2)设置容器属性
宽、高、位置、颜色、布局、可见 . . .
3)添加组件
4)添加事件监听
事件源、事件、监听器、处理办法 . . .
1. 示例:
import java.awt.*;import java.awt.event.*; class AwtDemo{ public static void main(String[] args) { //--------------------------------------------1 //顶层容器:框架 Frame f=new Frame("FirstAWT"); //--------------------------------------------2 f.setSize(400, 300); //大小 f.setLocation(300, 200); //位置 f.setVisible(true); //可见 //Frame默认是边界布局,改为流布局 f.setLayout(new FlowLayout()); //--------------------------------------------3 Button b=new Button("This isa button"); f.add(b); //在框架上添加按钮 //--------------------------------------------4 f.addWindowListener(newMyEvent()); }} //窗口关闭处理class MyEvent extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.out.println(e.toString()); System.exit(0); }}
2. 界面与事件分离:
import java.awt.*;import java.awt.event.*; class AwtDemo{ private Frame f; private Button b; AwtDemo() { init(); //创建界面 event(); //添加事件处理 } public void init() { f=new Frame("FirstAWT"); f.setSize(400, 300); f.setLocation(300, 200); f.setLayout(new FlowLayout()); f.setVisible(true); b=new Button("This is a exitbutton"); f.add(b); } public void event() { f.addWindowListener(new WindowAdapter() //窗体事件监听 { public void windowClosing(WindowEvent e) { System.out.println(e.toString()); System.exit(0); } }); b.addActionListener(new ActionListener() //动作事件监听 { public void actionPerformed(ActionEvent e) { System.out.println("点击按钮退出"); System.exit(0); } }); } public static void main(String[] args) { new AwtDemo(); }}
四. 按钮事件:
import java.awt.*;import java.awt.event.*; class AwtDemo{ private Frame f; private Button b; AwtDemo() { init(); } public void init() { f=new Frame("FirstAWT"); f.setSize(400, 300); f.setLocation(300, 200); f.setVisible(true); f.setLayout(new FlowLayout()); b=new Button("This is a exitbutton"); f.add(b); event(); } public void event() { f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvente) { System.exit(0); } }); //动作(状态)触发事件 b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("按钮被触发动作"+e.toString()); } }); //鼠标触发事件 b.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { System.out.println("鼠标点击:"+e.toString()); if(e.getClickCount()==2) { System.out.println("双击事件"); } if(e.getClickCount()==3) { System.out.println("三击事件"); } } public voidmouseEntered(MouseEvent e) { //System.out.println("鼠标移到:"+e.toString()); } }); //键盘触发事件 b.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { System.out.println("按下键:"+e.getKeyChar()+",对应ASCII码:"+e.getKeyCode()+",字符串表示:"+KeyEvent.getKeyText(e.getKeyCode())); if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER) { System.out.println("ctrlis down , and enter is down."); } } }); } public static void main(String[] args) { new AwtDemo(); }}
五. 事件处理示例:
六. 我的记事本:
import java.awt.*;import java.awt.event.*;import java.io.*;class AwtDemo {private File file;//文件操作类private FileDialog fileDialogSave;//文件选择对话框-保存private FileDialog fileDialogOpen;//文件选择对话框-打开private Frame frame;//窗体private Menu menuEdit;//菜单-编辑private Menu menuFile;//菜单-文件private Menu menuNew;//子菜单-新建private MenuBar menuBar;//菜单栏private MenuItem menuItemExit;//菜单项-退出private MenuItem menuItemCpp;//菜单项-Cppprivate MenuItem menuItemJava;//菜单项-Javaprivate MenuItem menuItemOpen;//菜单项-打开private MenuItem menuItemSave;//菜单项-保存private TextArea textArea;//文本域AwtDemo(){init();//初始化}public void init(){//菜单项menuItemExit=new MenuItem(" 退 出 ");menuItemCpp=new MenuItem("C++");menuItemJava=new MenuItem("Java");menuItemOpen=new MenuItem(" 打 开 ");menuItemSave=new MenuItem(" 保 存 ");//子菜单menuNew=new Menu(" 新 建 ");menuNew.add(menuItemCpp);menuNew.add(menuItemJava);//菜单menuFile=new Menu(" 文 件 ");menuFile.add(menuItemOpen);menuFile.add(menuItemSave);menuFile.add(menuNew);menuFile.add(menuItemExit);//菜单menuEdit=new Menu(" 编 辑 ");//菜单栏menuBar=new MenuBar();menuBar.add(menuFile);menuBar.add(menuEdit);//文本域textArea=new TextArea();//窗体frame=new Frame("我的记事本");frame.setBounds(200, 100, 600, 500);//x,y,w,h//frame.setLayout(new FlowLayout());//默认边界布局,TextArea随窗体大小填充//添加菜单栏frame.setMenuBar(menuBar);frame.add(textArea);//文件选择窗口fileDialogSave=new FileDialog(frame, "我要保存", FileDialog.SAVE);fileDialogOpen=new FileDialog(frame, "我要打开", FileDialog.LOAD);//事件处理event();frame.setVisible(true);}public void event(){frame.addWindowListener(new WindowAdapter()//窗体退出事件{public void windowClosing(WindowEvent e){System.exit(0);}});menuItemOpen.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){fileDialogOpen.setVisible(true);String filePath=fileDialogOpen.getDirectory();String fileName=fileDialogOpen.getFile();if(filePath==null || fileName==null)return;textArea.setText("");File file=new File(filePath, fileName);try{BufferedReader bufr=new BufferedReader(new FileReader(file));String line=null;while ((line=bufr.readLine())!=null){textArea.append(line+"\r\n");}bufr.close();}catch (IOException ioe){throw new RuntimeException("读取失败");}}});menuItemSave.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){if (file==null){fileDialogSave.setVisible(true);String filePath=fileDialogSave.getDirectory();String fileName=fileDialogSave.getFile();if (filePath==null || fileName==null)return;file=new File(filePath, fileName);}try{BufferedWriter bufw=new BufferedWriter(new FileWriter(file));String text=textArea.getText();bufw.write(text);bufw.close();}catch (IOException ioe){throw new RuntimeException();}}});menuItemExit.addActionListener(new ActionListener()//退出菜单触发事件{public void actionPerformed(ActionEvent e){System.exit(0);}});}public static void main(String[] args) {new AwtDemo();}}
七.Swing:
Swing是纯Java组件,可在不同的平台上实现相同的外观和行为。组件都在javax.swing包中。
我的图片查看器示例:
import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;import javax.swing.filechooser.FileNameExtensionFilter;class SwingDemo {private JFrame frame;//窗体private JMenuBar menuBar;//菜单栏private JMenu mnuFile;//文件菜单private JMenuItem mnuOpen;//打开项private JMenuItem mnuClose;//关闭项private JMenuItem mnuExit;//退出项private JMenu mnuEdit;//编辑菜单private JMenuItem mnuCopy;//复制项private JMenuItem mnuMove;//剪切项private JMenu mnuHelp;//帮助菜单private JMenu mnuContact;//联络private JMenuItem mnuWeb;//网站private JMenuItem mnuEmail;//邮箱private JMenuItem mnuAbout;//关于private JPanel panel;//菜单栏+工具栏private JToolBar toolBar;//工具栏private JButton btnOpen;//打开private JButton btnCopy;//复制private JFileChooser fileChooser;//文件选择器private JLabel label;//图片显示private JDialog dlgAbout;SwingDemo(){init();}public static void main(String[] args) {new SwingDemo();}/***初始化界面*/public void init(){mnuOpen=new JMenuItem(" 打 开 ...");//打开项mnuClose=new JMenuItem(" 关 闭 ");//关闭项mnuExit=new JMenuItem(" 退 出 ");//退出项mnuFile=new JMenu(" 文 件 ");//文件菜单mnuFile.add(mnuOpen);mnuFile.add(mnuClose);mnuFile.addSeparator();//分隔线mnuFile.add(mnuExit);mnuCopy=new JMenuItem(" 复 制 ");//复制项mnuMove=new JMenuItem(" 剪 切 ");//剪切项mnuEdit=new JMenu(" 编 辑 ");//编辑菜单mnuEdit.add(mnuCopy);mnuEdit.add(mnuMove);mnuWeb=new JMenuItem("网站");//网站mnuEmail=new JMenuItem("邮箱");//邮箱mnuContact=new JMenu("联系方式");//联络mnuContact.add(mnuWeb);mnuContact.add(mnuEmail);mnuAbout=new JMenuItem("关于本软件");//关于mnuHelp=new JMenu(" 帮 助 ");//帮助菜单mnuHelp.add(mnuContact);mnuHelp.add(mnuAbout);menuBar=new JMenuBar();//菜单栏menuBar.add(mnuFile);menuBar.add(mnuEdit);menuBar.add(mnuHelp);btnOpen=new JButton();//打开工具btnOpen.setIcon(new ImageIcon("e:/ico_o.png"));//图标btnOpen.setToolTipText("打开");//提示btnCopy=new JButton();//复制工具btnCopy.setIcon(new ImageIcon("e:/ico_c.png"));btnCopy.setToolTipText("复制");toolBar=new JToolBar();//工具栏toolBar.setFloatable(false);//锁定toolBar.add(btnOpen);toolBar.add(btnCopy);panel=new JPanel();//菜单栏和工具栏panel.setLayout(new BorderLayout());panel.add(menuBar, BorderLayout.NORTH);panel.add(toolBar);label=new JLabel();String title="我的图片查看器";//窗体标题frame=new JFrame(title);frame.setBounds(200, 100, 500, 450);//x,y,w,hframe.setLayout(new BorderLayout());frame.add(panel, BorderLayout.NORTH);frame.add(label, BorderLayout.CENTER);fileChooser=new JFileChooser();event();frame.setVisible(true);//显示窗体}/***事件处理*/public void event(){//窗体的关闭按钮frame.setDefaultCloseOperation(3);//"EXIT_ON_CLOSE",点击关闭按钮程序退出//文件菜单下的“打开”项mnuOpen.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){selectPic();}});//文件菜单下的“关闭”项mnuClose.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){if (label.getIcon()!=null){label.setIcon(null);}}});//文件菜单下的“退出”项mnuExit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){System.exit(0);}});//帮助菜单下的“关于”项mnuAbout.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){dlgAbout=new JDialog(frame, "关于“我的图片查看器”");dlgAbout.setBounds(300, 300, 350, 300); JLabel lblAbout=new JLabel("第一个SWing软件哦"); dlgAbout.add(lblAbout);dlgAbout.setVisible(true);}});//btnOpen.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){selectPic();}});}private void selectPic(){fileChooser.setFileFilter(new FileNameExtensionFilter("JPG文件", "jpg"));fileChooser.showOpenDialog(frame);File file=fileChooser.getSelectedFile();label.setIcon(new ImageIcon(file.toString()));//并非直接显示图片,而是作为图标}}
旁观者的姓名永远爬不到比赛的计分板上。