简单画板实现的总结
一.实现简单画板需要使用的JavaAPI类:
JFrame
JPanel
JButton
JMenuBar
JMenu
JMenuItem
MouseListener
MouseEvent
ActionListener
ActionEvent
绘制图形图像的对象
Graphics
String
二. 匿名内部类
1.没有类名,不需要
class。
2.在另外一个类的{}中间。
3.超过四行代码就不考虑使用,可考虑新建一个类。
三.实现一个简单画板的步骤
1.定义好界面类。
2.给按钮添加动作
监听器方法,绑定
事件处理类的对象。使用的是匿名内部类。
(使用参数传递)
3.给绘图面板添加动作监听器方法,绑定事件处理类的对象定义一个类实现MouseListener
接口。
/**************************练习**********************************/
总结:
1.要学会灵活运用变量。当没有现成的java方法能够直接解决问题的时候,可将思路打开,思考其他可行的方法,比如可以使用变量。在这次练习中的三角形画法中,如果运用了变量,问题也就能轻松搞定了。
1).将变量作中间变量使用
exp:
声明
全局变量(DrawingListener中)
private int startX, startY, endY, endX;// 中间变量,用来存储第一条线的起始点和结束点
2)将变量作计数器使用
exp:
private int count = 0;// 计数器,用来统计三角形的图形执行到第几步
2.画三角形时,画线和单击是两个不同的事件。如果你的代码是这样:
public void mouseClicked(MouseEvent e1) {
System.out.println("单击");
x3 = e1.getX();
y3 = e1.getY();
if (dr.getShapes().equals("Triangle") && count == 1) {
// 绘制三角形
g.drawLine(x1,y1, x3, y3);
g.drawLine(x2,y2, x3, y3);
//将count的值转为第一次点击三角形
count=0;
}
那么你画三角形时首先要画的第一条直线就不能成功。原因是:单击这个动作包括了按下、释放、单击三个动作。如果你的代码是如上写法,那么你的x1,x2,x3所在的坐标点都是同一个点。也就是说,你根本没在画直线,你不过是在单击而已!
所以你的代码应是这样:(其中startX是x1的中间变量,它可用来存储直线的x1的地址;
startY是y1的中间变量,它可用来存储直线的y1的地址;
endX是x2的中间变量,它可用来存储直线的x2的地址;
endY是y2的中间变量,它可用来存储直线的y2的地址;)
public void mouseClicked(MouseEvent e1) {
System.out.println("单击");
x3 = e1.getX();
y3 = e1.getY();
if (dr.getShapes().equals("Triangle") && count == 1) {
// 绘制三角形
g.drawLine(startX, startY, x3, y3);
g.drawLine(endX, endY, x3, y3);
//将count的值转为第一次点击三角形
count=0;
}
3. 要获取画布对象就必须在窗体可见之后才能获取,否则获取Null。
4. 类实现接口的时候,必须要实现接口中所有的抽象方法。就算有的抽象方法暂时用不到,也要把它放在你的类里!
5.
画图形的时候,要考虑鼠标按下和释放的坐标值大小不同的情况。
exp:
if((x1>x2)&&(y1>y2)){
g.drawRect(x2, y2, Math.abs(x2 - x1), Math.abs(y2 - y1));
}
else if((x2>x1)&&(y2>y1)){
g.drawRect(x1, y1, Math.abs(x2 - x1), Math.abs(y2 - y1));
}
else if((x2>x1)&&(y1>y2)){
g.drawRect(x1, y2, Math.abs(x2 - x1), Math.abs(y2 - y1));
}
else if((x1>x2)&&(y2>y1)){
g.drawRect(x2, y1, Math.abs(x2 - x1), Math.abs(y2 - y1));
}