`
ShXin
  • 浏览: 13034 次
  • 性别: Icon_minigender_2
  • 来自: 天津
社区版块
存档分类
最新评论

同步java之重绘(2)

阅读更多

       重绘,顾名思义,是要将我们所绘制过的图形重新绘制一遍以显示到屏幕上,上一篇说的是用数组来保存形状,那是否还有别的方法做到重绘呢?

       试想,我们是不是可以把绘制的图形保存成一张图片,然后将它显示出来。这就要用到一个Robot方法,来捕捉我们屏幕上的每个像素点。

       我们做画板时继承的是JFrame类,那如果继续继承窗体这一类,在截屏时就会截到窗体的边框,再打印出来后就会把整个窗体都显示在画布上。所以为了正确的截屏,我们让画板继承JPanel类。这样只需要传入一个面板对象,将它添加到窗体上就可以实现:

public class Draw extends JPanel{
	public static void main(String[] args) {
		// 实例化窗体对象
		Draw pan = new Draw();
		pan.enter(pan);
	}
	private void enter(JPanel pan) {
		//实例化一个窗体对象
		JFrame frame = new JFrame();
		// 设置属性
		frame.setTitle("简单画板");
		frame.setSize(600, 480);
		frame.setDefaultCloseOperation(3);
		frame.setLocationRelativeTo(null);
		//将pan面板添加到窗体上
		frame.add(pan);
		frame.setVisible(true);		

		//获取画布对象
		Graphics g = pan.getGraphics();
		
		//实例化事件处理类的对象
		Listener dl = new Listener(g,this);
		//给事件源添加鼠标监听器方法
		pan.addMouseListener(dl);
}

        这时,我们就要往监听器中添加模块了,首先要传入画布对象和面板对象,然后获取面板左上角的位置已经面板大小,这样就可以截取屏幕了,最后我们只需将图像按照像素分割成单独的点,并将每个点的颜色存入数组。

public class Listener implements MouseListener {

	private int x1,y1,x2,y2;	
	private Graphics g;
	private Draw du;	
	Robot rob;
	public static int image[][];
	
	//创建监听器对象时传入一个画布对象
	public Listener(Graphics g,Draw du){
		this.g=g;
		this.du=du;
		
		try{
			rob = new Robot();
		}catch(AWTException e){
			e.printStackTrace();
		}		
	}

	public void mouseReleased(MouseEvent e) {
		
		g.setColor(new Color(0, 0, 0));
		// 鼠标释放时候光标的位置
		x2 = e.getX();
		y2 = e.getY();
		
		g.drawLine(x1, y1, x2, y2);
		
		//获取pan面板左上角的位置和窗体大小
		Point p = du.getLocationOnScreen();
		Dimension dim = du.getSize();
		// 创建矩形对象
		Rectangle rect = new Rectangle(p, dim);
		// 截取屏幕
		BufferedImage img = rob.createScreenCapture(rect);
		
		image = new int[img.getHeight()][img.getWidth()];
		//将图像按照像素分割成一个一个的点,将点的颜色存入数组
		for(int i=0;i<image.length;i++){
			for(int j=0;j<image[i].length;j++){
				//将颜色存入数组
				image[i][j] = img.getRGB(j, i);
			}
		}
		
	}
}

 [注]:这里继承MouseListener需要实现的其它方法省略。

 

现在只差最后一步就可以完成整个重绘了,那就是在画板类中实现重绘的方法:

public void paint(Graphics g) {
	// 调用父类的方法来正确的绘制窗体
	super.paint(g);

	// 如果数组存在,就重绘数据
	if (null != Listener.image) {
		// 重绘数组
		for (int i = 0; i < Listener.image.length; i++) {
			for (int j = 0; j < Listener.image[i].length; j++) {
				// 获取颜色
				int c = Listener.image[i][j];
				// 创建颜色对象
				Color color = new Color(c);
				g.setColor(color);
				g.drawLine(j, i, j, i);
			}
		}
	}
}

         这样,我们就完成了重绘的另一种方法。

 

分享到:
评论

相关推荐

    解决重绘时候闪屏问题的实例程序

    2. **优化重绘代码**:确保在重绘函数中只执行必要的绘图操作,避免不必要的计算和内存访问。减少重绘的复杂性和频率可以降低闪屏的可能性。 3. **利用硬件加速**:许多现代图形库支持硬件加速,可以利用GPU进行...

    JAVA UDP协议实现绘圆同步

    此外,注意绘图操作不应该直接在`Frame`的`Graphics`对象上进行,因为这会导致绘图在每次重绘时消失。通常应使用`BufferedImage`或其他绘图组件,然后在需要时更新`Frame`的内容。这个简单的示例仅用于演示UDP同步的...

    按钮,列表框重绘.按钮,列表框重绘

    当数据源发生变化时,可以通过数据模型的更新触发列表框的重绘,如Java的`ListModel`。 2. **多态视图**:在某些场景下,列表框的每一项可能需要有不同的展示形式,这可以通过实现自定义的列表渲染器来实现。 3. *...

    java开源包6

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包4

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包101

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包9

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包5

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包8

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包10

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    轻量的动静态绘图库

    【描述】:"主循环里,requestAnimationFrame 在所有形状都不需要重绘的时候暂停。" 这段描述揭示了轻量级绘图库的一个关键优化策略。`requestAnimationFrame`是JavaScript中用于在下一次重绘之前执行动画或更新UI...

    Java时钟小程序

    综上所述,"Java时钟小程序"利用了Java的Swing库构建GUI,使用Timer定时器以非阻塞方式周期性更新时间,并在UI线程安全地重绘时钟界面,以达到模拟实际时钟的效果。通过理解这些概念,你可以构建出一个功能完善的...

    java线程之滚动的文字

    3. **动画线程**:创建一个`Thread`或使用`ExecutorService`,在线程的`run()`方法中,不断更新`textPosition`,然后调用`repaint()`触发界面重绘。 4. **线程同步**:确保在更新`textPosition`和调用`repaint()`时...

    JAVA泡泡堂源代码

    在这个项目中,源代码会包含GUI设计,例如使用JPanel、JFrame等组件来构建游戏界面,通过重绘(paintComponent)方法来更新游戏画面。 学习这个源代码,开发者可以深入了解JAVA的游戏开发技巧,如: 1. 如何利用...

    JAVA连连看(包括源码。图片等)

    Java的AWT和Swing库提供了图形用户界面(GUI)的支持,其中的Component类提供了repaint()方法,用于触发组件的重绘。每当游戏状态发生变化时,调用这个方法可以使屏幕上的图像更新,保持画面同步。 提示功能则涉及...

    java(applet小动画)

    为了实现动画效果,程序会定期调用`repaint()`方法来重绘组件,每次重绘时根据时间或计数器更新位置,从而产生运动的假象。`paint()`或`update()`方法会被覆盖,以在每次重绘时执行必要的绘图操作。 为了使动画更具...

    java开源包3

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包2

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    java开源包1

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

    Java资源包01

    j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF...

Global site tag (gtag.js) - Google Analytics