学习资料来源:斯坦福大学公开课编程方法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)——指基线下字符最远能达到的距离
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)
交互式组件的使用:
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
addComponentListener(this);//listeners for Components
行分析函数:parseLine();
示例:(创建一个容器MyCanvas)
线程(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);//设置框架可视性
}
}