一、java简易画板的实现
在简易画板中,我们想要实现的是提供几种简易图形,点击两次或拖动鼠标时,可以画出这样的简易图形,并且能够更换颜色。
那么我们就需要一个JFrame界面,搭配一个可实现此功能的鼠标监听器。JFrame中提供了getGraphics()方法可得到java.awt.Graphics对象,即“画布”对象,我们可以通过调用Graphics对象的不同draw方法来实现画图。
(1)显示画图界面
类似于正常界面的搭建,我们可以制作一个简易的绘图界面(监听器的添加在之前的文章中已有详细描述,此处为已添加监听器的界面,不再赘述):
import java.awt.BorderLayout;
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 DrawUI {
//显示界面的方法
public void showUI() {
//创建窗体对象
DrawFrame drawFrame = new DrawFrame();
//设置窗体的属性
drawFrame.setSize(1000,600);
drawFrame.setLocationRelativeTo(null);
drawFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
drawFrame.setLayout(new FlowLayout());
//创建监听器对象
DrawListener drawL = new DrawListener();
//给窗体添加监听器
drawFrame.addMouseListener(drawL);
String btname []={"直线","矩形","椭圆"};
for(int i=0;i
JButton jb =new JButton(btname[i]);
drawFrame.add(jb);
jb.setBackground(Color.WHITE);//设置按钮颜色
jb.setPreferredSize(new Dimension(60,30));
jb.addActionListener(drawL);
}
String colorname []={"黑色","粉色","红色"};
Color [] color = {Color.black,Color.pink,Color.red};
for (int j =0;j
JButton jb = new JButton();
jb.setBackground(color[j]);
jb.setPreferredSize(new Dimension(60,30));
drawFrame.add(jb);
jb.addActionListener(drawL);
}
//设置窗体可见
drawFrame.setVisible(true);
//获取窗体的Graphics对象(画笔),图形画在哪个组件上,画笔就在该组件上获取
//且获取画笔对象一定要在窗体显示可见之后!
Graphics g = drawFrame.getGraphics();
//给监听器的画布对象赋值
drawL.g = g;
//给窗体对象的数组属性赋值
drawFrame.data = drawL.data;
}
public static void main(String[] args) {
//创建界面对象
DrawUI uu = new DrawUI();
uu.showUI();
}
}
一定要注意,若要在界面上画图,须获取窗体的Graphics对象(画笔),图形画在哪个组件上,画笔就在该组件上获取,且获取画笔对象一定要在窗体显示可见之后!
界面效果
(2)监听器类
上面我们已经做好了画图界面,我们要在监听器中建立画布对象,并对最开始所述的功能一一实现。由于按钮上有的是文字,有的是颜色,所以我们需要进行区分。记录图形类型的变量通过e.getSource()方法获取按钮信息
接着调用draw方法绘制图形即可
监听器整体代码:(包括部分重绘代码,在简易重绘中会具体讲解)
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 DrawListener implements MouseListener,ActionListener {
Graphics g ;//画布
int x,y,x2,y2;//记录坐标
String shape;//记录图形类型(文字)
private Color color; //记录图形类型(颜色)
int count = 0;//记录图形个数
Shape[] data = new Shape[1000];//创建一个保存图形对象的数组
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("")){//获取按钮信息,并区分文字与颜色
JButton jbuc=(JButton)e.getSource();//获取JButton的所有信息,e.getSource()可获取所有组件信息
color = jbuc.getBackground();
}
else{
shape = e.getActionCommand();//获取按钮上的文字
}
}
public void mousePressed(MouseEvent e) {
//获取鼠标按下的坐标
x= e.getX();
y= e.getY();
g.setColor(color);
}
public void mouseReleased(MouseEvent e) {
//获取鼠标松开的坐标
x2=e.getX();
y2=e.getY();
//判断图形类型
if("直线".equals(shape)) {
g.drawLine(x, y, x2, y2);
}else if("矩形".equals(shape)) {
g.drawRect(x, y, 100, 50);
}
else if("椭圆".equals(shape)){
g.drawOval(x, y, 100, 50);
}
//创建一个图形对象
Shape s= new Shape(x, y, x2, y2, shape, Color.BLACK);
//存入数组
data[count] = s;
count++;
}
public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
这样一个简易的绘图板就基本实现了。
二、简易重绘
上面我们实现了简易的绘图板,但可能有人会发现,当我们调整窗口尺寸,或者最小化窗口后再次打开,我们绘制出的图形都会消失。
这是因为窗体在屏幕上显示时,会先将窗体对象的数据从内存中取出到缓存中,然后在屏幕上绘制。窗体改变时又会重新执行该步骤。我们画的图形并未保存,窗体重绘时便消失了。
那么我们只要想办法将画出的图形一并保存,让窗体重绘时连带我们所绘制的图形一起重绘即可解决这一问题。
(1)创建Shape类保存数据并写出绘制方法
绘图过程中,我们需要保存的数据有点的坐标,形状,以及颜色:
记录好数据后用所记录的数据进行绘制:
对于L-system或3D图形等的重绘,则此步较为复杂。
(2)在监听器中创建Shape数组保存数据
我们每用鼠标画一次图,监听器中的数据就会赋值一次,所以我们在监听器中创建数组保存数据
储存数据。
(3)重写paint方法
由于paint方法在JFrame类中,所以需要让你重写的paint方法所在的类继承JFrame:
通过以上三步,便可实现画图板的简易重绘。