gdi按钮重绘背景黑色_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<btname.length;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<colorname.length;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对象(画笔),图形画在哪个组件上,画笔就在该组件上获取,且获取画笔对象一定要在窗体显示可见之后!

界面效果

c22ed54465584c7c2143aeac0f0fdc3e.png

(2)监听器类

上面我们已经做好了画图界面,我们要在监听器中建立画布对象,并对最开始所述的功能一一实现。由于按钮上有的是文字,有的是颜色,所以我们需要进行区分。

2c76dbf854e018c68b8332a087e074e0.png
记录图形类型的变量

f449902845923fdb8a23b710fdade008.png
通过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类保存数据并写出绘制方法

绘图过程中,我们需要保存的数据有点的坐标,形状,以及颜色

ff1e8eace940d88dfa39d612e59790c9.png

记录好数据后用所记录的数据进行绘制:

0a54178e4d3b0ec865ecb1577085eac7.png

对于L-system或3D图形等的重绘,则此步较为复杂。

(2)在监听器中创建Shape数组保存数据

我们每用鼠标画一次图,监听器中的数据就会赋值一次,所以我们在监听器中创建数组保存数据

9a9ef60b22b3ac7ed67e2dbd562e8f28.png

c4e18b8cc1153e255caedc3974901945.png

储存数据。

(3)重写paint方法

由于paint方法在JFrame类中,所以需要让你重写的paint方法所在的类继承JFrame:

f1c171c1307a4266713ee053ccbe9419.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值