初级画图板
一:实现简单窗口
frame.setLocationRelativeTo(null);//位置居中
frame.setDefaultCloseOperation(3);//关闭窗体时程序退出
frame.setLayout(new FlowLayout());//设置布局格式
二:实现画直线
两点确定一条直线,故需要获取鼠标按下及释放时的点的坐标,再通过窗体的画布对象来调用画直线的方法。
frame.setVisible(true);//可见
gra = frame.getGraphics();//获取窗体的画布对象,否则指针为空,必须是可见之后才能获取
........
gra.drawLine(x1,y1,x2,y2);
获取点的坐标要让窗体添加鼠标监听,MouseListener是个接口,不能直接实例化,故可以通过匿名内部类的方式来处理,方法体中重写接口的所有方法(除此外还可以通过继承其已经实现的类(系统的或自己写的类)来解决)
//以匿名内部类的方式创建一个鼠标事件监听器对象(买)
MouseListener mouse_listener = new MouseListener(){
//重写MouseListener的所有方法
};
//给窗体添加鼠标事件监听器(安装)
frame.addMouseListener(mouse_listener);
三:添加直线,矩形,椭圆等几个按钮,能进行切换并能画出这几种图形。关键是添加监听器
JButton line=new JButton("直线");
frame.add(line);
创建监听器并给按钮添加监听ActionListener:同MouseListener一样,不过只需要重写一个方法
ActionListener ac=new ActionListener(){
public void actionPerformed(ActionEvent e){
command=e.getActionCommand(); //获得每次按下的命令
}
};
//给直线按钮添加监听器
line.addActionListener(ac);
...............
public void mousePressed(MouseEvent e){
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e){
x2 = e.getX();
y2 = e.getY();
if("直线".equals(command)){gra.drawLine(x1,y1,x2,y2);
}else if("矩形".equals(command)){
gra.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x2-x1),Math.abs(y2-y1));
}
四:添加颜色选择器,能进行颜色的选择
if("颜色".equals(command)){
c = JColorChooser.showDialog(frame, "请选择颜色",Color.black);
command=n;//还原选择“颜色”之前的按钮命令,否则按下颜色按钮之后无法画出图形,命令会被覆盖掉
}else{
n=command;//如果按下的不是‘颜色’,保存此按钮选择
}
另外:
如果内部类过于冗长,则将其移出,作为一个单独的类,会遇到传参的问题。
例如:将MouseListener移出为MyMouseListener.java
其实例化过程为: MyMouseListener 实现MouseListener接口,再通过创建MyMouseListener类的对象
要在MyMouseListener.java中使用Paint.java中的窗体、画布等,可以通过监听器实例化过程,构造函数传参来实现。
//Paint.java中, 将画布及当前的paint对象传递MouseListener mouse_listener = new MyMouseListener(gra,this);
//MyMouseListener.java中, 接收
public MyMouseListener(Graphics g,Paint p){
gra = g;
paint=p;
}
“命令”,“颜色”的获取可以通过在MyMouseListener.java中创建一个paint对象,调用paint的getCommand();返回command;[getColor()返回color]
//Paint.java中
public String getCommand(){
return command;
}
//MyMouseListener.java中
command=paint.getCommand();