`
尘大大
  • 浏览: 10899 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

二维数组重绘

 
阅读更多
实现画图面板的重绘,起初的思路是创建数组存储一个几何图形的起始坐标和末尾坐标,在paint方法中

重新绘制出来。这种方法虽然简单可行,但是存在一些严重的缺陷:
1.数组的大小无法估计,极易会造成存储空间的浪费或者溢出。
2.绘制的几何图形越多存储的坐标值越多,甚至会出现坐标值的重复存储。
3.只能绘制一些简单的图形,复杂图形的绘制十分困难。
4.颜色的存储尚未找到解决方法。
通过存储像素点来实现重绘使得重绘变得简单容易理解,一张图片是由许多像素点构成的,而这些像素点

只有颜色Color这一个属性。所以,我们仅需定义一个二维数组,将这些像素点如同填充二维表一样存储

在数组中就行了。在画图面板的监听器DrawingListener中的mouseReleased方法中调用获取像素点,存储

像素点的方法:
    public class DrawingListener extends MouseAdapter{
          ....
    public void mouseReleased(){
...          

    getPoint();
}
    private void getPoint{
      BufferedImage image=onScreen();
    //遍历image图片
    for(int i=0;i<image.getWidth();i++){
    for(int j=0;j<image.getHeight();j++){
    DrawingPanel.a[i][j]=image.getRGB(i, j);
    }
    }
}
   private BufferedImage onScreen(){
  //获取画图面板相对于窗体的坐标
    Point point=panel.getLocationOnScreen();
    //实例化一个封装矩形类的对象
    Rectangle rect=new Rectangle((int)point.getX(),(int)point.getY(),panel.getWidth

(),panel.getHeight());
       //进行截屏操作
    BufferedImage image=robot.createScreenCapture(rect);
    return image;}

}
鼠标松开代表着某一图像画完,所以在mouseReleased方法中调用getPoint比在mousePressed以及

mouseDragged方法中更好,使getPoint方法的调用次数最少。
由于paint方法在之前关于重绘的总结中已经有所介绍,所以需要改变的仅仅是重绘的方法体:  
对paint方法的进一步理解
什么时候执行?
1.窗体最小化最大化
2.窗体拖动到电脑屏幕外时
由于接受像素点的数组初始值为零,故在没有调用getPoint方法时数组元素得到的颜色对象都为黑色。这

样的后果是打开编写好的画图板时它的画图面板的颜色为黑色(用数组的初始值执行paint方法造成的)

。为了避免这一现象,可以记录paint方法的执行次数,设定其第一次执行时不运行像素点的重绘。
代码如下:
        JPanel draw=new JPanel(){

//重绘的方法
   public void paint(Graphics g){
count++;
      super.paint(g);
      System.out.println("paint");
      if(count>1){
      for(int i=0;i<a.length;i++){
      for(int j=0;j<a[i].length;j++){
      //将int数转化为Color对象
      Color color=new Color(a[i][j]);
      //绘制像素点
      g.setColor(color);
      g.drawLine(i,j,i,j);
      }
      }
      }
   };
   };
但是这样仍然有问题,如果画图板第一次打开后没有进行任何绘图操作,对窗体进行最小化最大化时,就

会执行重绘方法使画图板变成黑色。而将画图板拖出屏幕时,被拖出的部分也会变为黑色。因为获取像素

点的方法定义在监听器中的mouseRleased方法中,没有执行绘图操作时数组仍然保持其初始值。
为了避免这一现象须在以上代码中的if条件中加一条限制条件。即数组必须被赋值后才能执行重绘像素点

的操作。
本人在画图板监听器DrawingListener中用static 声明了一个变量c(初始值为0),每执行一次给数组赋

值时即使c+1,再将代码改为如下:
        JPanel draw=new JPanel(){

//重绘的方法
   public void paint(Graphics g){
count++;
      super.paint(g);
      System.out.println("paint");
      if(count>1&&DrawingListener.c>0){
      for(int i=0;i<a.length;i++){
      for(int j=0;j<a[i].length;j++){
      //将int数转化为Color对象
      Color color=new Color(a[i][j]);
      //绘制像素点
      g.setColor(color);
      g.drawLine(i,j,i,j);
      }
      }
      }
   };
   };
0
0
分享到:
评论

相关推荐

    AndEngine二维数组地图

    本篇将深入探讨如何利用AndEngine的SpriteBatch机制来绘制基于二维数组的地图。 首先,理解二维数组在地图设计中的作用至关重要。二维数组通常被用来表示地图的格子结构,每个元素代表地图上的一个位置,可能包含...

    微信小程序——二维数组添加机柜页面.zip

    此外,考虑到状态管理,可以使用微信小程序的Page对象提供的data属性来存储二维数组,每次数组变化时,通过this.setData方法更新数据,这会触发页面的自动重绘。同时,为了防止数据错乱,应确保在并发操作(如多个...

    VC将二维数组显示为图像

    在VC++环境中,将二维数组转化为图像并进行显示是一项常见的任务,特别是在图像处理和计算机视觉领域。本知识点主要讲解如何利用VC++实现这一功能,并探讨其中的关键技术。 首先,二维数组通常用来存储图像数据,每...

    C#实现各种二维图形绘制

    为了防止图形在窗口重绘时闪烁,可以使用双缓冲技术。创建一个`Bitmap`对象,先在其上完成所有绘制操作,然后一次性将`Bitmap`内容绘制到`Graphics`对象上。这样可以显著减少闪烁现象: ```csharp private Bitmap ...

    一首四句的古诗从右到左竖排输出

    在Windows系统中,WM_PAINT消息是用于窗口重绘的,当窗口部分或全部需要更新时,系统会发送这个消息。在这个场景中,每当接收到WM_PAINT消息,我们需要重新绘制古诗的文本。这通常涉及到BeginPaint和EndPaint函数的...

    C#GDI绘图,二维CAD 对绘出的图形的抓取

    本主题主要关注如何利用C#和GDI+来实现二维CAD(Computer-Aided Design)图形的绘制和抓取。 首先,了解C#中的GDI+绘图基础。GDI+提供了一系列类,如`Graphics`、`Pen`、`Brush`和`Shape`等,用于绘制线条、形状和...

    虚拟现实-镂垫-2维(C语言完成)

    6. **渲染优化**:即使在2D环境中,为了保持流畅的帧率,也需要考虑性能优化,如避免不必要的重绘、使用缓冲技术和适当的内存管理。 7. **数学基础**:理解向量和矩阵运算对于在2D空间中移动、旋转和缩放对象至关...

    picturebox图片重绘.rar

    4. **定义刮除区域**:刮除区域可以用一个二维数组或List来表示,每个元素代表图片的一个像素是否被刮除。初始时,所有像素都被视为未刮除。 5. **重绘图像**:在Paint事件中,首先绘制背景图片。然后,遍历刮除...

    C#中如何将combobox 显示项重绘为表格

    要实现多列布局,我们需要将数据存储在一个可以按行和列访问的数据结构中,如DataTable或二维数组。在OnDrawItem方法中,遍历每一行和每一列,根据数据绘制相应的单元格。 4. 表格样式: 为了模仿表格效果,可以...

    二维 matlab 绘图的基本压缩算法:二维 matlab 绘图的基本压缩算法(使您的 LaTeX 文档的 eps 图像变小!)-matlab开发

    适用于2D matlab绘图的基本压缩算法(在您的LaTeX文档中导入小而整齐的eps图像!) 如果您希望每个像素的点密度很高,则需要绘制高度填充的向量,请使用它们。 *************************************... % 重文件h1 =

    简易二维CAD

    - 避免无效绘图:通过更新矩形和OnPrepareDC()函数,只重绘改变的部分,提高绘图效率。 - 多线程:在复杂计算或大量数据处理时,可以考虑使用多线程技术,提高用户体验。 总的来说,"简易二维CAD"项目是一个很好...

    C#实现绘制二维曲线

    在C#编程环境中,绘制二维曲线是一项常见的任务,特别是在数据可视化、科学计算或者游戏开发等领域。本项目提供了一个实现方式,无需依赖外部数据库,能够直接根据给定的数据生成二维曲线。下面将详细介绍如何使用C#...

    交互式二维图形程序

    棋盘通常用二维数组表示,每个元素代表一个格子的状态(空、X或O)。当用户点击棋盘时,程序会计算出相应的棋盘坐标,更新状态数组,并重新绘制棋盘以显示新放置的棋子。 为了实现游戏逻辑,开发者需要编写一系列...

    java五子棋课设(含人机对战).rar

    ⑥悔棋:使用两个动态数组储存每一次下棋的x、y坐标,悔棋时对两个非空二维数组进行弹出,根据得到的上一步的坐标删除该坐标在棋盘数组上对应的存在状态,并重绘棋盘,更新状态变量等。 ⑦人机对战:经测试,根据...

    C#画多条二维曲线C#画多条二维曲线

    在C#编程中,画多条二维曲线是一项常见的任务,特别是在数据可视化、科学计算或图形用户界面设计中。本文将详细讲解如何使用C#来绘制二维曲线,主要涉及以下知识点: 1. **GDI+图形库**:C#中用于绘制图形的核心库...

    MFC编写的五子棋

    MFC是微软提供的一套面向对象的C++类库,用于构建Windows应用程序,而五子棋则是通过图形用户界面(GUI)呈现的典型游戏,它在编程中主要应用到二维数组来存储和操作棋盘状态。 首先,我们来看MFC框架。MFC为开发者...

    canvas-倒计时.rar

    在描述中提到的“三维数组打印各种图形”,这可能是指用一维数组表示行,二维数组表示列,而三维数组则可能用于存储更复杂的图形信息,例如颜色、形状等。例如,开发者可能使用一个三维数组来表示像素画,每个元素...

    EVC 绘制二维曲线实例

    这可能需要在消息处理函数(如`WM_PAINT`)中实现,或者通过定时器触发重绘操作。 7. **数据结构和算法**:为了绘制曲线,需要有适当的数据结构存储曲线点,例如数组或链表。根据曲线的数学特性,可能需要使用特定...

    二维魔方 BCB 源代码 C++

    二维魔方,作为一种趣味性的智力游戏,其在编程领域中也常常被用作学习和实践算法的案例。BCB(Borland C++ Builder)是 Borland 公司推出的一款集成开发环境,它基于C++语言,提供了丰富的可视化组件和快速的应用...

Global site tag (gtag.js) - Google Analytics