zoukankan      html  css  js  c++  java
  • 201771010128王玉兰《面向对象程序设计(Java)》第十三周学习总结

    第一部分:基础理论知识

    1.事件处理基础

    事件源(event source):能够产生事件的对象都可 以成为事件源,如文本框、按钮等。一个事件源是一个 能够注册监听器并向监听器发送事件对象的对象。

    事件监听器(event listener):事件监听器对象接 收事件源发送的通告(事件对象),并对发生的事件作 出响应。一个监听器对象就是一个实现了专门监听器接 口的类实例,该类必须实现接口中的方法,这些方法当 事件发生时,被自动执行。

     事件对象(event object):Java将事件的相关信息 封装在一个事件对象中,所有的事件对象都最终派生于 java.util.EventObject类。不同的事件源可以产生不 同类别的事件。

    监听器对象:是一个实现了特定监听器接口( listener interface)的类实例。

     事件源:是一个能够注册监听器对象并发送事件对 象的对象。

     当事件发生时,事件源将事件对象自动传递给所 有注册的监听器。

     监听器对象利用事件对象中的信息决定如何对事 件做出响应。

    程序员需完成的两个步骤(在GUI设计里)

    1)定义实现某事件监听器接口的事件监听器类,并具体化接口中声明的事件处理抽象方法。

    2) 为组件注册实现了规定接口的事件监听器对象;

    2.动作

    动作事件(ActionEvent):当特定组件动作(点 击按钮)发生时,该组件生成此动作事件。

    该 事 件 被 传 递 给 组 件 注 册 的 每 一 个 ActionListener 对象, 并 调 用 监 听 器 对 象 的 actionPerformed方法以接收这类事件对象。

    能够触发动作事件的动作,主要包括: (1) 点击按钮 (2) 双击一个列表中的选项; (3) 选择菜单项; (4) 在文本框中输入回车。

    3.监听器接口的实现:

    监听器类必须实现与事件源相对应的接口,即必 须提供接口中方法的实现。 

    A:创建按钮对象 JButton类常用的一组构造方法: (1) JButton(String text):创建一个带文本的按钮。

    (2) JButton(Icon icon) :创建一个带图标的按钮。

    (3)JButton(String text, Icon icon) :创建一个带文本和图标 的按钮。

    B:按钮对象的常用方法 ① getLabel( ):返回按钮的标签字符串; ② setLabel(String s):设置按钮的标签为字符串s

    4.鼠标事件

    鼠标事件 – MouseEvent A:鼠标监听器接口 – MouseListener – MouseMotionListener B:鼠标监听器适配器 – MouseAdapter – MouseMotionAdapter

    用户点击鼠标按钮时,会调用三个监听器方法:

    – 鼠标第一次被按下时调用mousePressed方法;

    – 鼠标被释放时调用mouseReleased方法;

    – 两个动作完成之后,调用mouseClicked方法。
    A: 鼠标在组件上移动时,会调用mouseMoved方法。
    B:如果鼠标在移动的时候还按下了鼠标,则会调用 mouseDragged方法。

     鼠标事件返回值 – 鼠标事件的类型是MouseEvent,当发生鼠标事件时:

    MouseEvent类自动创建一个事件对象,以及事件发生 位置的x和y坐标,作为事件返回值。

    MouseEvent类中的重要方法 – public int getX( ); – public int getY( ); – public Point getPoint( ); – public int getClickCount( ); 

    5.AWT事件继承层次:

     所有的事件都是由java.util包中的EventObject 类扩展而来。

    A: AWTEevent 是所有AWT 事件类的父类, 也是 EventObject的直接子类。

    B: 有些Swing组件生成其他类型的事件对象,一般直 接 扩 展 于 EventObject, 而不是AWTEvent,位于 javax.swing.event.*。

    C: 事件对象封装了事件源与监听器彼此通信的事件 信息。在必要的时候,可以对传递给监听器对象的 事件对象进行分析。

    第二部分:实验

    1、实验目的与要求

    (1) 掌握事件处理的基本原理,理解其用途;

    (2) 掌握AWT事件模型的工作机制;

    (3) 掌握事件处理的基本编程模型;

    (4) 了解GUI界面组件观感设置方法;

    (5) 掌握WindowAdapter类、AbstractAction类的用法;

    (6) 掌握GUI程序中鼠标事件处理技术。

    2、实验内容和步骤

    实验1: 导入第11章示例程序,测试程序并进行代码注释。

    测试程序1:

    l  在elipse IDE中调试运行教材443页-444页程序11-1,结合程序运行结果理解程序;

    l  在事件处理相关代码处添加注释;

    l  用lambda表达式简化程序;

    l  掌握JButton组件的基本API;

    l  掌握Java中事件处理的基本编程模型。

    package button;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * A frame with a button panel
     */
    public class ButtonFrame extends JFrame
    {
       private JPanel buttonPanel;
       private static final int DEFAULT_WIDTH = 300;
       private static final int DEFAULT_HEIGHT = 200;
    
       public ButtonFrame()
       {      
    	   //调整组件的大小,宽度和高度
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    
          // 创建了三个按钮对象
          JButton yellowButton = new JButton("Yellow");
          JButton blueButton = new JButton("Blue");
          JButton redButton = new JButton("Red");
    
          buttonPanel = new JPanel();
    
          // 向面板添加按钮
          buttonPanel.add(yellowButton);
          buttonPanel.add(blueButton);
          buttonPanel.add(redButton);
    
          //将面板添加到框架
          add(buttonPanel);
    
          // 创建按钮对象
          ColorAction yellowAction = new ColorAction(Color.YELLOW);
          ColorAction blueAction = new ColorAction(Color.BLUE);
          ColorAction redAction = new ColorAction(Color.RED);
    
          // 将动作与按钮相关联
          yellowButton.addActionListener(yellowAction);
          blueButton.addActionListener(blueAction);
          redButton.addActionListener(redAction);
       }
    
       /**
        * An action listener that sets the panel's background color.
        */
       private class ColorAction implements ActionListener
       //ColorAction类后面实现了一个监听器接口类ActionListener
       {
          private Color backgroundColor;
     //Color 类用于封装默认 sRGB 颜色空间中的颜色,或者用于封装由 ColorSpace 标识的任意颜色空间中的颜色
    
          public ColorAction(Color c)
          {
             backgroundColor = c;
          }
    
          public void actionPerformed(ActionEvent event)
          {
             buttonPanel.setBackground(backgroundColor);
          }
       }
    }
    

      

    package button;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.34 2015-06-12
     * @author Cay Horstmann
     */
    public class ButtonTest
    {
       public static void main(String[] args)
       {
    	   //lambda表达式
          EventQueue.invokeLater(() -> {
             JFrame frame = new ButtonFrame();
             frame.setTitle("ButtonTest");
             //setTitle表示将此窗体的标题设置为制定的字符串
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             //根据参数的值显示或隐藏窗口
             frame.setVisible(true);
          });
       }
    }
    

      运行结果:

    以下是分别用三种方法对上面的程序进行化简程序,但是结果一样

    package button;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * A frame with a button panel
     */
    public class ButtonFrame extends JFrame {
    	private JPanel buttonPanel;
    	private static final int DEFAULT_WIDTH = 300*2;
    	private static final int DEFAULT_HEIGHT = 200*2;
    
    	public ButtonFrame() {
    		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    		//用new运算符调用构造器
    		buttonPanel = new JPanel();
    	//创建按钮生成了三个按钮对象
    		makeButton("黄色", Color.yellow);
    		makeButton("蓝色", Color.blue);
    		makeButton("红色", Color.red);
    		makeButton("绿色",Color.green);
    		add(buttonPanel);
    
    	}
    
    	protected void makeButton(String name,Color backgound) {
    		// 创建按钮
    		JButton button = new JButton(name);
    		// 向面板添加按钮
    		buttonPanel.add(button);
    		// 创建按钮操作
    		//方法一:通过内部类方式实现
    		/*ColorAction action = new ColorAction(backgound);
    		// associate actions with buttons
    		button.addActionListener(action);*/
    		//方法二:匿名内部类方式实现
    		button.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// TODO 自动生成的方法存根
    				buttonPanel.setBackground(backgound);
    			}
    		});
    		//方法三通过lambad表达式实现
    		button.addActionListener((e)->{
    			buttonPanel.setBackground(backgound);
    		});
    		
    	}
    
    	/**
    	 * An action listener that sets the panel's background color.
    	 */
    	//这是实现了 ActionListener接口的内部类
    	/*private class ColorAction implements ActionListener {
    	 //实现了标准接口:监听器接口,类名是ColorAction
    		private Color backgroundColor;
    
    		public ColorAction(Color c) {
    			backgroundColor = c;
    		}
    
    		public void actionPerformed(ActionEvent event) {
    			buttonPanel.setBackground(backgroundColor);
    		}
    	}*/
    }
    

      运行结果:

    测试程序2:

    l  在elipse IDE中调试运行教材449页程序11-2,结合程序运行结果理解程序;

    l  在组件观感设置代码处添加注释;

    l  了解GUI程序中观感的设置方法。

    package plaf;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    
    /**带有按钮面板的框架,用于改变外观
     * A frame with a button panel for changing look-and-feel
     */
    public class PlafFrame extends JFrame
    {
       private JPanel buttonPanel;
    
       public PlafFrame()
       {
          buttonPanel = new JPanel();
    //获得一个用于描述已安装的观感的对象数组
          UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
          for (UIManager.LookAndFeelInfo info : infos)
        	  //返回观感的显示名称
             makeButton(info.getName(), info.getClassName());
          //返回观感实现类的名称
    
          add(buttonPanel);
          pack();
          //调整此窗口的大小,以适合其子组件的首选大小和布局。
       }
    
       /**
        * Makes a button to change the pluggable look-and-feel.
        * @param name the button name
        * @param className the name of the look-and-feel class
        */
       private void makeButton(String name, String className)
       {
          // 向面板添加按钮
          JButton button = new JButton(name);
          buttonPanel.add(button);
    
          // 设定按钮动作
    
          button.addActionListener(event -> {
             // 按钮动作:切换到新的外观
             try
             {
                UIManager.setLookAndFeel(className);
                //className - 指定实现外观的类名称的字符串 
                // Swing方法的集合
                SwingUtilities.updateComponentTreeUI(this);
                //简单的外观更改:将树结构中的每个节点转到 updateUI() -- 也就是说,通过当前外观初始化其 UI 属性。 
                pack();
             }
             catch (Exception e)//抛出异常
             //Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
             {
                e.printStackTrace();
                //Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
             }
          });
       }
    }

     

    package plaf;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.32 2015-06-12
     * @author Cay Horstmann
     */
    public class PlafTest
    {
       public static void main(String[] args)
       {
    	   //lambda表达式
          EventQueue.invokeLater(() -> {
             JFrame frame = new PlafFrame();
             frame.setTitle("PlafTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             //退出应用程序默认窗口关闭操作
             frame.setVisible(true);
          });
       }
    } 
    

    运行结果:

     

    测试程序3:

    l  在elipse IDE中调试运行教材457页-458页程序11-3,结合程序运行结果理解程序;

    l  掌握AbstractAction类及其动作对象;

    l  掌握GUI程序中按钮、键盘动作映射到动作对象的方法。

    package action;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * A frame with a panel that demonstrates color change actions.
     */
    public class ActionFrame extends JFrame
    {//JPanel是一般轻量级容器
       private JPanel buttonPanel;
       private static final int DEFAULT_WIDTH = 300;
       private static final int DEFAULT_HEIGHT = 200;
    
       public ActionFrame()
       {
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    
          buttonPanel = new JPanel();
    
          //定义动作
          Action yellowAction = new ColorAction("Yellow", new ImageIcon("yellow-ball.gif"),
                Color.YELLOW);
          Action blueAction = new ColorAction("Blue", new ImageIcon("blue-ball.gif"), Color.BLUE);
          Action redAction = new ColorAction("Red", new ImageIcon("red-ball.gif"), Color.RED);
    
          // 添加这些操作的按钮
          buttonPanel.add(new JButton(yellowAction));
          buttonPanel.add(new JButton(blueAction));
          buttonPanel.add(new JButton(redAction));
    
          // 将面板添加到框
          add(buttonPanel);
    
          // 将y b和r键与名称相关联
          InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
          imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
          imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
          imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");
    
          // 将名称与操作相关联
          ActionMap amap = buttonPanel.getActionMap();
          //ActionMap 提供从 Object(称为键 或 Action 名)到 Action 的映射
          amap.put("panel.yellow", yellowAction);
          //put:添加一个 key 到 action 的绑定
          amap.put("panel.blue", blueAction);
          amap.put("panel.red", redAction);
       }
       
       public class ColorAction extends AbstractAction
       //ColorAction类接口实现了AbstractAction接口的继承
       {
          /**
           * Constructs a color action.
           * @param name the name to show on the button
           * @param icon the icon to display on the button
           * @param c the background color
           */
          public ColorAction(String name, Icon icon, Color c)
          {
             putValue(Action.NAME, name);
             //NAME用来存储动作的 String 名称的键,用于菜单或按钮。 
             putValue(Action.SMALL_ICON, icon);
             //用来存储小型 Icon(比如 ImageIcon)的键
             putValue(Action.SHORT_DESCRIPTION, "Set panel color to " + name.toLowerCase());
             putValue("color", c);
          }
        //指示发生了组件定义的动作的语义事件
          public void actionPerformed(ActionEvent event)
          //发生操作时调用
          {
             Color c = (Color) getValue("color");
             buttonPanel.setBackground(c);//调用setBackground方法并设置背景颜色
          }
       }
    } 

     

    package action;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.34 2015-06-12
     * @author Cay Horstmann
     */
    public class ActionTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             JFrame frame = new ActionFrame();
             frame.setTitle("ActionTest");//设置组件自定义的标题按钮
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //
    /一个图形界面默认都是不可见的,setVisible把图形界面设置为可见
    frame.setVisible(true); 
    });
    }
    }

    运行结果:

    测试程序4:

    l  在elipse IDE中调试运行教材462页程序11-4、11-5,结合程序运行结果理解程序;

    l  掌握GUI程序中鼠标事件处理技术。

    package mouse;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.util.*;
    import javax.swing.*;
    
    /**
     * A component with mouse operations for adding and removing squares.
     */
    public class MouseComponent extends JComponent
    {
       private static final int DEFAULT_WIDTH = 300;
       private static final int DEFAULT_HEIGHT = 200;
    
       private static final int SIDELENGTH = 10;
       private ArrayList<Rectangle2D> squares;
       private Rectangle2D current;
       // 包含鼠标光标的正方形
       public MouseComponent()
       {
          squares = new ArrayList<>();
          current = null;
    
          addMouseListener(new MouseHandler());
          addMouseMotionListener(new MouseMotionHandler());
       }
    
       public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }   
       
       public void paintComponent(Graphics g)
       {
          Graphics2D g2 = (Graphics2D) g;
    
          // 画所有正方形
          for (Rectangle2D r : squares)
             g2.draw(r);
       }
    
       /**
        * Finds the first square containing a point.
        * @param p a point
        * @return the first square that contains p
        */
       public Rectangle2D find(Point2D p)
       {
          for (Rectangle2D r : squares)
          {
             if (r.contains(p)) return r;
          }
          return null;
       }
    
       /**
        * Adds a square to the collection.
        * @param p the center of the square
        */
       public void add(Point2D p)//Point2D 类定义表示 (x,y) 坐标空间中位置的点。
       {
          double x = p.getX();
          //以 double 精度返回此 Point2D 的 X 坐标
          double y = p.getY();
          //以 double 精度返回此 Point2D 的 Y 坐标。
    
          current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,
                SIDELENGTH);
          //Rectangle2D 类描述通过位置 (x,y) 和尺寸 (w x h) 定义的矩形。 
          squares.add(current);
          repaint();//重绘此组件。
       }
    
       /**
        * 从集合中移除正方形
        * @param s the square to remove
        */
       public void remove(Rectangle2D s)
       {
          if (s == null) return;
          if (s == current) current = null;
          squares.remove(s);
          repaint();
       }
    
       private class MouseHandler extends MouseAdapter//接收鼠标事件的抽象适配器类
       {
    	   //鼠标按键在组件上按下时调用。
          public void mousePressed(MouseEvent event)
          {
             // 如果光标不在正方形内添加一个新的正方形
             current = find(event.getPoint());
             if (current == null) add(event.getPoint());
          }
    //鼠标按键在组件上单击(按下并释放)时调用。 
          public void mouseClicked(MouseEvent event)
          {
             // 如果双击,删除当前正方形
             current = find(event.getPoint());
             if (current != null && event.getClickCount() >= 2) remove(current);
          }
       }
    
       private class MouseMotionHandler implements MouseMotionListener
       {
          public void mouseMoved(MouseEvent event)
          {
             // 如果光标在内部,请将其设置为十字准线
             //一个矩形
    
             if (find(event.getPoint()) == null) setCursor(Cursor.getDefaultCursor());
             else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
          }
    
          public void mouseDragged(MouseEvent event)
          {
             if (current != null)
             {
                int x = event.getX();
                int y = event.getY();
    
                // 拖住当前矩形,使其居中于 (x, y)
                current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
                repaint();
             }
          }
       }   
    }
    

      

    package mouse;
    
    import javax.swing.*;
    //提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。
    
    /**
     * 包含用于测试鼠标操作的面板的框架。
     */
    public class MouseFrame extends JFrame//继承
    {
       public MouseFrame()
       {
          add(new MouseComponent());//将指定组件追加到此容器的尾部
          pack();//调整此窗口的大小,以适合其子组件的首选大小和布局
       }
    }
    

      

    package mouse;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.34 2015-06-12
     * @author Cay Horstmann
     */
    public class MouseTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             JFrame frame = new MouseFrame();
             frame.setTitle("MouseTest");//设件自定义的鼠标按钮组建
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }
    

      

    运行结果:

    实验2:结对编程练习

    利用班级名单文件、文本框和按钮组件,设计一个有如下界面(图1)的点名器,要求用户点击开始按钮后在文本输入框随机显示2017级网络与信息安全班同学姓名,如图2所示,点击停止按钮后,文本输入框不再变换同学姓名,此同学则是被点到的同学姓名。

    package dianmingqi;
    import java.awt.EventQueue;
    
    import javax.management.Query;
    import javax.swing.JFrame;
    
    import dianmingqi.ButtonFrame;
    
    public class Main {
        public static void main(String[] args) {
            EventQueue.invokeLater(()->{
                ButtonFrame buttonFrame = new ButtonFrame();
                buttonFrame.setVisible(true);
                buttonFrame.setTitle("点名器");
                buttonFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                
            });
        }
    }
    

      

    package dianmingqi;
    
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.StringBufferInputStream;
    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class ButtonFrame extends JFrame {
        private JPanel buttonPanel;
        private static final int DEFAULT_WIDTH = 300 * 2;
        private static final int DEFAULT_HEIGHT = 200 * 2;
        private JButton jButton;
        private JLabel jLabel;
        private ArrayList<String> arrayList;
    
        public ButtonFrame() {
            setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            buttonPanel = new JPanel();
            buttonPanel.setLayout(null);
            add(buttonPanel);
            jLabel = new JLabel("点名器");
            jButton = new JButton("开始");
            jButton.setBackground(Color.gray);
            jLabel.setBounds(100, 50, 60, 30);
            jButton.setBounds(100, 120, 60, 30);
            arrayList = new ArrayList<>();
            //读文件
            File file = new File("D:/studentnamelist.txt");
            FileInputStream fis;
            try {
                fis = new FileInputStream(file);
                InputStreamReader in = new InputStreamReader(fis);
                BufferedReader buf = new BufferedReader(in);
                String readLine;
                while ((readLine = buf.readLine())!=null) {
                    arrayList.add(readLine);
                    
                }
            } catch (FileNotFoundException e1) {
                // 待办事项自动生成的捕获块
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            
            jButton.addActionListener(new ActionListener() {
                Timer timer;
    
                public void actionPerformed(ActionEvent e) {
                    if (jButton.getText().equals("开始")) {
                        timer = new Timer();;
                        TimerTask timerTask = new TimerTask() {
                            public void run() {
                                jButton.setText("停止");
                                jButton.setBackground(Color.red);
                                jLabel.setText(arrayList.get((int) (Math.random() * 43)));
                            }
    
                        };
                        timer.schedule(timerTask, 0, 10);
                    }
                    if (jButton.getText().equals("停止")) {
                        timer.cancel();
                        jButton.setText("开始");
                        jButton.setBackground(Color.gray);
                    }
                }
            });
            buttonPanel.add(jLabel);
            buttonPanel.add(jButton);
            add(buttonPanel);
    
        }
    }
    

      运行结果:

     

    实验总结 :我们知道对于图形用户界面的程序来说,事件处理是十分重要的,需要掌握事件处理的基本方法和在AWT中如何捕获用户界面的组建和输入输出设备产生的事件。前面的测试实验中的一些关键点:action就是对事件动作的处理,它不是一个类,而是一个接口以及在鼠标事件中用击键与动作关联起来的方式,具体是InputMap imap 的相关用法,最后一个实验是我们与合作伙伴一起完成,很荣幸助教学长加入了我们的小组中,当然,实验也是他的指导下完成。不过尤其是我,下去还要自己去看代码的具体功能实现的模块。在理论知识的总过程中发现本章知识接触的新概念比较多,下去还要牢记。

     

     

     

     

  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/wang963/p/10014949.html
Copyright © 2011-2022 走看看