java 画图板重绘_java简易画板的实现以及简易“重绘”

一、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:

通过以上三步,便可实现画图板的简易重绘。


版权声明:本文为weixin_39829073原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。