学习资料来源:斯坦福大学公开课编程方法cs106aJAVA(下载中心有资源)

相关学习资料已上传至下载中心:学习过程中使用的代码、笔记初稿以及课程讲义(有兴趣者可自行下载)

学习过程中的大部分程序需要导入acm.jar包(已上传至下载中心,也可自行进入http://jtf.acm.org/ 进行下载),


GObject:


    super()——调用父类构造函数

    acm.graphics——添加进画布中的图形是有堆叠顺序的

    GCanvas——拼贴画的背景画布

    画布(GCanvas)和图形程序(GraphicsProgram)具有的方法:
        add(object)  向画布中添加对象
        add(object,x,y)  指定添加对象坐标
        remove(object)  移除对象
        getElementAt(x,y)-frontmost or null  根据坐标获取对象
        getHidth()  获取宽度
        getHeight()  获取高度
        setBackground(c)-color 设置画布背景颜色

    图形程序独有的方法:
        pause(milliseconds) —— 暂停(单位为毫秒)  
        waitForClick() —— 等待鼠标点击事件

    CObjects通用方法:
        setLocation(x,y) —— 设置坐标
        move(dx,dy) —— 偏移量 (dx为正向右移动,dx为负向左移动,dy为正向下移动,dy为负向上移动 )
        getX() getY() —— 返回对象的x和y坐标  
        getHidth() getHeight() —— 返回长和宽  
        contains(x,y) —— 返回真假(在特定的点处是否有存在对象)  
        setColor(c) getColor() —— 设置/获取对象颜色  
        setVisible(flag) —— 设置可视性(true/false)  
        isVisible() —— 如果对象可视visible返回true
        sendToFront() sendToBack() —— 改变z轴顺序(将指定对象移至z轴最前|最后位置)
        sendForward() sendBackward()——在z轴上移动对象

    GObject中的常用接口(Interface):
        填充接口:GFillable——setFilled(flag)  isFilled()  setFillColor(c)  getFillColor()
        设置对象窗口:CResizable——setSize(width,height)  setBounds(x,y,width,height)
        缩放接口:GScalable——scale(sf)   scale(sx,sy)-sx,sy为x,y上的缩放比例

    与排版有关的与字符有关的线:
        基线(baseline)——字符出现位置的线(有些字符会超出)-下滑线
        字符串高度(height):是指两行基准线之间的距离
        上线(ascent)——指最高的字符——让字符居中显示时使用
        下线(decent)——指基线下字符最远能达到的距离
   

wKiom1XzjxCQSe74AABeNydoRs4048.jpg

        
     GPolygon——画出线段组成的对称图形
    需要有一个参考点(假想参考点)——一般是图形的中心点


        用法:(绘制一个菱形)
            private GPolygon createDiamend(double width, double height){
                GPolygon diamend = new GPolygon();
                //diamend.addVertex(-width / 2, 0);
                diamend.addEdge(width/2,- height/2);
                //diamend.addVertex(0, -height / 2);
                diamend.addEdge(width/2, height/2);
                //diamend.addVertex(width / 2, 0);
                diamend.addEdge(-width/2, height/2);
                //diamend.addVertex(0, height / 2);
                diamend.addEdge(-width/2,- height/2);
                return diamend;
            }
            指定多边形顶点:
                addVertex(x,y)————x、y是相对于参考点的坐标
                addEdge(dx,dy)——添加一个顶点与前一个点有关

    GCompound——画复合的图形-把几种图形复合在一起成为一个对象

    事件驱动程序(Event-driven Programs)

        监听器(listener)—impot java.awt.event.*;
            addMouseListeners() —— 鼠标监听器
            addKeyListeners() —— 键盘监听器

        Mouse Events:
            mouseClicked(e)    ——点击
            mousePressed(e)    ——按着鼠标
            mouseReleased(e)   ——松开鼠标
            mouseMoved(e)      ——移动鼠标
            mouseDragged(e)    ——按着鼠标拖动

        Keyboard Events:
            keyPressed(e)    ——按着键盘中的某键
            keyReleased(e)   ——松开键盘中的某键
            keyTyped(e)      ——按下和释放的复合


        用法:
            /*捕获鼠标的实时位置信息*/
            public class MouseTracker extends GraphicsProgram{

                public void run(){
                    label = new GLabel("");
                    label.setFont("Times New Roman-36");//设置字体
                    add(label, 50, 50);
                    
                    addMouseListeners();//添加鼠标监听器
                }
                public void mouseMoved(MouseEvent e){//鼠标移动时执行的操作
                    label.setLabel("Mouse: ("+e.getX()+", "+e.getY()+")");//显示鼠标位置信息
                }
                
                private GLabel label;
            }

图形用户界面 —— GUI(Graphic User Interface)—— “Gooey”
import java.awt.event.*;——追踪事件
import javax.swing.*;——创建交互对象

    组件:
        Button(按键)   
        Sliders(滑块)   
        Checkboxes(复选框)  
        Radio Bottons(单选框)   
        Combo box(组合框、下拉框)
        Text box(文本框)

    J组件——交互式组件
    
    动作接收器:addActionlisteners();

    
    程序窗口
    分为五个部分:—— 边界布局(border layout)
 

wKioL1XzkfTy4l03AAFToybyRaI801.jpg

    交互式组件的使用:


        Button:

            public void init(){
                but = new JBtton(“Hi”);
                add(but, SOUTH);//将按钮添加至SOUTH中
                addActionListeners(); —— 动作接收器
            }

            public void actionPerformed(ActionEvent e){//接收动作并执行相应操作
               String cmd = e.getActionCommend();//返回的是对象的值
              if( cmd.equals(“Hi”)){
                prinln(“Hello”);
              }
            或:
              if(e.getSource == but){//getSource返回的是对象
                prinln(“Hello”);
              }
            }
            
            private JButton but;//声明按钮组件

        Checkbox:
            ……init() {
                check = new JCheckBox(“Front”);
                check.setSelcted(true); —— 设置默认为选定状态
                add(check,SOUTH); —— 添加复选框
            }
            private JCheckBox check;

        RadioButton:
            private JRadioButton sm;
            private JRadioButton med;
            private JRadioButton lag;

            sm = new JRadioButton(“small”);
            med = new JRadioButton (“medium”);
            lag = new JRadioButton (“large”);

            ButtonGroup size = new ButtonGroup(); //将单选框合并到一个组内
            size.add(sm);
            size.add(med);
            size.add(lag);

            med.setSelected(true); //设置默认选项
            add(sm, SOUTH);
            add(med, SOUTH);
            add(lag, SOUTH);

        Combo box:
            pick = new JComboBox();
            pick.addItem(“Black”);//添加选项
            pick.addItem (“Blue”);
            ……
            pick.setEditable(False);//设定用户不能编辑
            pick.setSelectedItem(“Black”);//设定默认选项
            add(pick,SOUTH);

            private JComboBox pick;
    
        文本框(Text Flied)
            JTextField tf = new JTextField(10);
            tf.addActionListeners(this);
            add(tf.SOUTH);

            if(e.getSource == tf) {
              println(“hi” + tf.getText());//tf.getText()返回文本框中的内容
            }

布局(Layout)


    边界布局(border layout)
    网格布局(Grid layout)—— 从左上角向右顺序添加元素,直到行尾,然后自动换行
    表格布局(table layout)—— 很像网格布局但更精确(不会让每个部件填充整个单元)


    用法:
        setLayout(new GridLayout(2,3));//2行3列
        setLayout(new TableLayout(2,3));
        add(new JButton("button 1"));
        add(new JButton("button 2"));
        add(new JButton("button 3"));
        add(new JButton("button 4"));
        add(new JButton("button 5"));
        add(new JButton("button 6"));
        
组件和对应的容器 —— Component/Container

wKiom1XzkGqQ5IpOAAGOtCZMPWM298.jpg


    addComponentListener(this);//listeners for Components
    行分析函数:parseLine();


    示例:(创建一个容器MyCanvas)

wKiom1XzkUiS40rJAAT6w5itQQg451.jpg


线程(Thread):启动同一个程序,可以同时运行多个进程(一个线程就相当于一个进程,多个线程互不干扰)

    Runnable接口继承自Runnable接口的类都可以作为一个线程

    创建线程:(一个类)
        public class Myclass implement Runnable {
            public Myclass () {}
            public void run() {}
        }

    调用线程:(通过thread.start()调用线程的执行方法)
        Myclass x = new Myclass();
        Thread t = new Thread(x);
        t.start();


框架(JFrame)—— 装窗口的框架


    用法:(创建一个Graphical Hello框架)
    public class GraphicalHelloWorld {

        public static void main(String[] args) {
            JFrame frame = new JFrame("Graphical Hello");//创建框架,并为其命名为—Graphical Hello
            //创建标签Hello world! 并使其剧中显示
            JLabel label = new JLabel("Hello world!",JLabel.CENTER);//center justifield
            //向框架中添加标签,设置框架尺寸
            frame.add(label);
            frame.setSize(500, 300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用户退出时结束进程
            frame.setVisible(true);//设置框架可视性
        }
    }
    wKiom1XzknSybW6AAABC2oFcjiI047.jpg