1.功能分析
我们需要做到的画图板是当用户点击鼠标两下,或者拖动,就能画出一些简单的直线,矩形,椭圆等等。
要达到这个要求,在java有一个添加鼠标监听器的方法。所以我们首先要显示一个JFrame界面,给JFrame界面添加已经实现的鼠标监听器。JFrame提供了一个geiGraphics()方法可以得到java.awt.Graphics对象,Graphics可以理解为“画布”对象,通过调用Graphics对象的不同的draw方法并传入鼠标的坐标参数。(此时的界面就像一个直角坐标,原点在左上角,通过记录鼠标点击事件的次数和每次点击时,鼠标所在的坐标,再用draw方法就可以画出想要的图形了)。
2初步实现
1.出现画图界面
首先我们要像前面一样显示一个界面,这里不做赘述。(不需要添加其他组件的界面,可以添加按钮代表不同的形状和颜色)这里简单的添加一些如“直线”,“矩形”,“椭圆”和“红色”“黑色”“蓝色”这几个按钮。代码如下:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class DrawFrame extends JFrame {
public static void main(String []args){
DrawFrame df = new DrawFrame();
df.Frame();
}
public void Frame(){
this.setTitle("画板");
this.setSize(700,800);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.getContentPane().setBackground(Color.white);
FlowLayout layout = new FlowLayout(FlowLayout.CENTER, 40, 10);
this.setLayout(layout);
String btname [] = {"直线","矩形","椭圆"};
for(int i=0;i<btname.length;++i){
JButton jbu = new JButton(btname[i]);
jbu.setPreferredSize(new Dimension(60,30));
this.add(jbu);
}
String colorname[] = {"红色","黑色","蓝色"};
Color [] color = {Color.red,Color.black,Color.blue};
for(int j=0;j<colorname.length;++j){
JButton jbu = new JButton();
jbu.setBackground(color[j]);
jbu.setPreferredSize(new Dimension(60,30));
this.add(jbu);
}
this.setVisible(true);
}
}
这里我换了一种方式创建了一个画图板界面,继承JFrame类,然后在进行设置。
此时运行起来是这样的:
2.给界面添加鼠标监听器
然后我们就需要给界面添加监听器,用来获取鼠标按下和释放时候的坐标。在java鼠标监听器中,鼠标有五种事件可被监听,分别为:按下,释放,点击,进入(界面),退出(界面)。
进入是指你的光标进入了界面
退出当然就是退出了那个界面之外
按下是你鼠标光标在界面里并执行按下操作
释放是你按下后释放
点击则是你执行按下并释放这两个操作
在继承mouselistener这个借口之后就会有五种方法,如下面代码:
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class FrameListener implements MouseListener {
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
上面我们已经弄出了画图板界面,现在我们就要把这个鼠标监听器添加给画图板界面,这样当我们用鼠标在界面上操作时就会触发监听器里面的方法。
但如果我们要画图还要用到另一个类,Graphics,画笔,我们在那个组件上面画图从窗体,就要在那个组件获取画笔对象。这里我们当然是在窗体上获取画笔对象,但是一定要在窗体显示可见之后。
如此之后运行整个程序,我们便能在窗体上画出直线了。
同理我们可以实现画矩形,画椭圆的目标。
3.给按钮添加监听器
上面我们已经能在出现的界面中画直线,椭圆等了,但细心的或发现,我在界面上创立了诸如 “直线”,“椭圆”和一些颜色的按钮,能否实现点击相应的按钮就能用鼠标画出相应的图形并配上颜色的,那么这就是我们 的第三步了。这里我们需要用到一个ActionListener接口。看下面代码:
下面给出两个类的代码:
DrawFrame类
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
public class DrawFrame extends JFrame {
public static void main(String []args){
DrawFrame df = new DrawFrame();
df.Frame();
}
public void Frame(){
this.setTitle("画板");
this.setSize(700,800);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.getContentPane().setBackground(Color.white);
FlowLayout layout = new FlowLayout(FlowLayout.CENTER, 40, 10);
this.setLayout(layout);
FrameListener fl = new FrameListener();//创建监听器对象
String btname [] = {"直线","矩形","椭圆"};
for(int i=0;i<btname.length;++i){
JButton jbu = new JButton(btname[i]);
jbu.setPreferredSize(new Dimension(60,30));
jbu.addActionListener(fl);
this.add(jbu);
}
String colorname[] = {"红色","黑色","蓝色"};
Color [] color = {Color.red,Color.black,Color.blue};
for(int j=0;j<colorname.length;++j){
JButton jbu = new JButton();
jbu.setBackground(color[j]);
jbu.setPreferredSize(new Dimension(60,30));
jbu.addActionListener(fl);
this.add(jbu);
}
this.setVisible(true);
//画笔:图形画在那个组件上,画笔就从改组件上获取
//从窗体上获取画笔对象,一定要在窗体显示可见之后
Graphics g = this.getGraphics();
this.addMouseListener(fl);//给窗体添加监听器方法
fl.setGr(g);//将画笔对象传到监听器
}
}
FrameListener类
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
public class FrameListener implements MouseListener, ActionListener {
private Graphics g;
private Color color;//定义颜色属性
private String name;//接受按钮上的文字
private int x1,y1,x2,y2;
public void setGr(Graphics g){
this.g = g;
}
// 操作添加ActionListener的对象时调用此方法
public void actionPerformed(ActionEvent e) {
//操作按钮时获取按钮信息,并对是文字还是颜色进行分类
if(e.getActionCommand().equals("")){
JButton jbuc=(JButton)e.getSource();
//可以获得JButton的所有信息,e.getSource();可以获取所有组件信息string name2=e.getText。
color = jbuc.getBackground();
}
else{
name = e.getActionCommand();//如果按钮上有文字,获取文字,用name变量保存
}
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
x1=e.getX();
y1=e.getY();//获取按压时的点坐标
g.setColor(color);//可以通过对按钮执行按压操作改变画笔的颜色
}
public void mouseReleased(MouseEvent e) {
x2=e.getX();
y2=e.getY();//获取释放时候点的坐标
if("直线".equals(name))
g.drawLine(x1, y1, x2, y2);//画直线
if("矩形".equals(name))
g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
if("椭圆".equals(name))
g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1-x2), Math.abs(y1-y2));
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
程序运行结果:
这样我们就实现了一个简单的画图板,聪明的你还可以添加更多的颜色,加上更多的图案。