#功能分析
我们要实现一个画图板,首先从最简单的开始。第一步,实现基本图形的绘制,例如,鼠标点两下或按下拖动释放,可以画一条直线或矩形;第二步,适当添加几个按钮,按下按钮后可以绘制对应的图形,实现简单的选择功能;第三步,添加几种颜色以供选择。至于后面,可以根据自己的兴趣爱好添加相应的功能,甚至可以做下画图板的布局美化工作。我们注意到,绘制的图形要靠鼠标来控制绘制图形的各类、形状、颜色等,这就需要用到鼠标事件监听器(MouseListener)、动作事件监听器(ActionListener)。
#如何显示
创建一个JFrame界面,设置可视。
#如何让程序使用鼠标
给JFrame添加我们要实现画图功能所需要的监听器。
动作事件监听器(MouseListener),其中有一个actionPerformed的方法,在画图板中,可以将鼠标监听器对象添加给一个按钮,当按钮被点击时,按钮就会调用所有监听器actionPerformed方法。在本例中,我们可以获得按钮里的文字,如直线、三角形,以供我们选择画什么图形;可以获得按钮对象,如btn1、btn2;可以获得按钮背景颜色,用作颜色选择。
鼠标事件监听器(MouseListener),其中的方法有mousePressed(鼠标按下)、mouseReleased(鼠标释放)、mouseClicked(鼠标点击)、mouseEntered(鼠标进入)、mouseExited(鼠标离开)
#如何绘制
Graphics对象必须从绘制的容器上获取,即从JFrame界面上获取,JFrame类提供了一个getGraphics()方法得到画布对象。
窗体界面
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 Draw1 {
public static void main(String[]args){
Draw1 draw=new Draw1();
draw.show();
}
//构造一个窗体对象
public void show(){
JFrame jf=new JFrame();
jf.setTitle("画图板");//标题
jf.setSize(800,600);//界面大小
jf.setResizable(false);//界面不可改变大小
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭时退出程序
//设置窗体布局
jf.setLocationRelativeTo(null);
FlowLayout bl=new FlowLayout();
jf.setLayout(bl);
//创建按钮
JButton btn1=new JButton("直线");
JButton btn2=new JButton("矩形");
JButton btn3=new JButton("三角形");
JButton btn4=new JButton("多边形");
JButton color1=new JButton();
JButton color2=new JButton();
JButton color3=new JButton();
color1.setBackground(Color.BLACK);
color2.setBackground(Color.BLUE);
color3.setBackground(Color.RED);
Dimension coldim=new Dimension(40,30);
color1.setPreferredSize(coldim);
color2.setPreferredSize(coldim);
color3.setPreferredSize(coldim);
//添加到窗体上
jf.add(btn1);
jf.add(btn2);
jf.add(btn3);
jf.add(btn4);
jf.add(color1);
jf.add(color2);
jf.add(color3);
//设置可视
jf.setVisible(true);
//获取画布对象,获取在窗所占的区域
Graphics g=jf.getGraphics();
//创建监听器并将画笔对象传给监听器对象
DrawListener1 dlis=new DrawListener1(g);
//加上监听器
jf.addMouseListener(dlis);
btn1.addActionListener(dlis);
btn2.addActionListener(dlis);
btn3.addActionListener(dlis);
btn4.addActionListener(dlis);
color1.addActionListener(dlis);
color2.addActionListener(dlis);
color3.addActionListener(dlis);
}
}
监听器
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 DrawListener1 implements ActionListener, MouseListener{
private int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5;
private String name;
private Graphics g;
public DrawListener1(Graphics g) {
this.g = g;
}
public void actionPerformed(ActionEvent e) {
//获取按钮上的颜色
if ("".equals(e.getActionCommand())) {
JButton button = (JButton) e.getSource();
Color color = button.getBackground();
g.setColor(color);
}
else {
//获取按钮上的字符串
name = e.getActionCommand();
}
}
//获取坐标
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) {
//画直线
if ("直线".equals(name)) {
x2 = e.getX();
y2 = e.getY();
g.drawLine(x1, y1, x2, y2);
//画矩形
} else if ("矩形".equals(name)) {
x2 = e.getX();
y2 = e.getY();
g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));
}
}
int n = 0;
public void mouseClicked(MouseEvent e) {
//画三角形
if ("三角形".equals(name)) {
if (n == 0) {
x3 = e.getX();
y3 = e.getY();
g.drawLine(x3, y3, x3, y3);
n++;
}
else if (n == 1) {
x4 = e.getX();
y4 = e.getY();
g.drawLine(x3, y3, x4, y4);
n++;
}
else if (n == 2) {
x5 = e.getX();
y5 = e.getY();
g.drawLine(x3, y3, x5, y5);
g.drawLine(x4, y4, x5, y5);
n = 0;
}
}
//画多边形
else if ("多边形".equals(name)) {
if (n == 0) {
x3 = e.getX();
y3 = e.getY();
g.drawLine(x3, y3, x3, y3);
n++;
}
else if (n == 1) {
x4 = e.getX();
y4 = e.getY();
g.drawLine(x3, y3, x4, y4);
n++;
}
else if (n == 2) {
//鼠标左键不断获取点
if (e.getButton() == 1) {
x5 = e.getX();
y5 = e.getY();
g.drawLine(x4, y4, x5, y5);
x4 = x5;
y4 = y5;
}
//鼠标右键多边形首尾相连
else if (e.getButton() == 3) {
g.drawLine(x5, y5, x3, y3);
n = 0;
}
}
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
运行结果