仿xp画板的重绘

2024-06-03 06:18
文章标签 画板 xp 重绘

本文主要是介绍仿xp画板的重绘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

          首先我们讨论一下,为什么会需要重绘?

          如果没有重绘,当我们将画板最小化,然后再最大化是,你会发现,画板上之前画的内容消失了,这是为什么呢?

         1.你没有将你所化的内容存储起来,这里就需要我之前讲过的数组队列

         2.当你把画板最小化,然后最大化时,相当于重新实例化了一个画布,而旧的画布则被Java中的垃圾回收机制所回收。

         

          那我们如何实现重绘呢?

          有几部我们要先做好:

          1.先建立一个画板

          2.要有一个数组队列(用上一篇中的数组队列即可)

          3.图形抽象类类

          4.具体图形类继承抽象类

          5.图形的存储

 

一.布局:

        我的xp画板用的是流式布局和边界布局还有网格布局,整体用的是流式,分为北,西,中,南。

        而中部放有我的画布,在实现中部时我定义了一个函数create_centerjpanel();而重绘的调用即用匿名内部类的方式的,代码如下:

写道
private JPanel create_centerjpanel() {
// 实例化一个底层面板
JPanel jp = new JPanel() {
public void paint(Graphics g) {
// 首先要调用父类的构造方法
super.paint(g);
for (int i = 0; i < Xp_drawListener.list.size(); i++) {
// 实例化一个shape对象并调用子类的draw方法,获取链表的内容并调用draw
Shape s = Xp_drawListener.list.get(i);
s.draw(g);
}
}
};
jp.setBackground(Color.gray);
jp.setLayout(new FlowLayout(FlowLayout.LEFT));

JPanel jp1 = new JPanel();
jp1.setPreferredSize(new Dimension(500, 400));
jp1.setBackground(Color.white);

jp.add(jp1);

this.add(jp, BorderLayout.CENTER);

// 添加中部面板的监听

return jp1;

}

 通过这种方式,当每次实例化JPane 时,都会使用匿名内部类重绘我存在list数组中的内容

 

       而画板我简单的实现了画笔,橡皮,画直线,矩形,椭圆,圆,圆矩形,填充等功能。此时我们对每一个图形都需要一个图形类来分别对每一个类的具体怎么画进行定义,这也就是为什么我没有用一个类来实现,而是退而求其次用不同的图形类继承抽象类,来共用公有的属性和方法。

       而当我们写子类的时候要注意,子类的构造方法要含有父类的构造方法的参数。

       一下我附上部分功能的代码:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;public class ShapeRoundRect extends Shape{public ShapeRoundRect(int x1, int x2, int y1, int y2,  Color color,int width) {super(x1, y1, x2, y2,color, width);// TODO Auto-generated constructor stub}@Overridepublic void draw(Graphics g) {//设置颜色g.setColor(getColor());//强制转换成子类的对象Graphics2D g2 = (Graphics2D)g;g2.setStroke(new BasicStroke(this.getWidth()));System.out.println("圆角矩形");g.drawRoundRect(getX1(), getY1(),getX2()-getX1(),getY2()-getY1(),15, 15);}
}

 

      画笔的方法挺巧妙的,分享一下:

     x2 = e.getX();
     y2= e.getY();
     g.drawLine(x1, y1, x2, y2);
     x1 = x2;
     y1 = y2;

简简单单的5行代码实现画笔,感觉老NB了,呵呵!!

 

 

这篇关于仿xp画板的重绘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026200

相关文章

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

什么是回流与重绘,如何尽力避免

回流(reflow)和重绘(repaint)是浏览器渲染页面的两个不同过程。 回流概念(reflow) 当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来。这个过程就是回流(也叫重排)。【重新排列布局,即打碎重组】 重绘概念(repaint)

BrushNet重绘电商商品背景效果测试

🎨背景 之前写过一篇文章,简单的介绍了brushnet这个局部重绘节点,如何安装和使用可以参考我之前写的这篇文章,本篇重点测试下在背景生成这部分,brushnet是不是跟默认的inpaint有比较大的效果提升。 上一篇节点介绍内容链接: ComfyUI-BrushNet(局部重绘)节点安装及效果、模型下载及详细使用方法✨_brushnet模型放哪里-CSDN博客 🎄测试 首先搭建个基

MFC---重绘按钮

#ifndef _VANCBUTTON_MFC_H_ #define _VANCBUTTON_MFC_H_ #include "VUIControl.h" /**************************************************************/ //作者:Vansix //功能:重载CButton //版本:1.0 //修订:2016.05.08 //其

C# 窗体中Control以及Invalidate,Update,Refresh三种重绘方法的区别

在 C# 中,Control 类是 Windows Forms 应用程序中所有控件的基类。它提供了控件的基本功能和属性,这些功能和属性被所有继承自 Control 类的子类所共享。这意味着 Control 类是构建 Windows Forms 应用程序中用户界面元素的基础。 以下是 Control 类的一些关键特性和方法: 属性: Size:获取或设置控件的宽度和高度。Location:获

Win XP获史诗升级,支持64位应用还能畅玩最新3A

在整个 Windows 发展历程中,不乏出现过一些让大家印象深刻甚至被不少人视为「白月光」的版本。 其中最让小忆印象深刻的还得是 2001 年 8 月正式发布的 Windows XP。 经典蓝天白云(Bliss 壁纸)、全新视窗外观和用户界面、沿用至今的最小化按钮,还有蜘蛛纸牌、扫雷等小游戏…… 这些都给老机民的过去留下了浓墨重彩的一笔。 当然,正如白月光永远只存在于记忆当

xp系统怎么设置虚拟内存

参考: 1、​​​​​​xp系统怎么设置虚拟内存|xp在哪里设置虚拟内存-系统城 2、32位Windows7上8G内存使用感受+xp 32位下使用8G内存 (转) - 3D入魔 - 博客园

信息打点-APP小程序篇抓包封包XP框架反编译资产提取

知识点: 1、小程序-外在-资产收集 2、App-外在&内在-资产收集 演示案例: APP-外在抓包-Fd&茶杯&Brup APP-外在抓包-封包监听工具 APP-内在提取(从源代码中寻找)-AppInfoScanner 1、 GitHub - kelvinBen/AppInfoScanner: 一款适用于以HW行动/红队/渗透测试团队为场景的移动端(Android、iOS、W

再见!XP!微软举行“欢送Windows XP暨Windows 8.1体验会”

Windows XP 即将在 4 月 8 日终止支持,你淮备好了吗? 随著 Windows XP 的退役时间越来越近,Microsoft 希望所有使用者都能够尽快转移到最新的 Windows 8.1 系统。因此 Microsoft 于 28 日开始一连三天,假台北信义区香堤大道举行“欢送 Windows XP 暨 Windows 8.1 体验会”,通过 Windows 8.1 的体验、教学,欢送已

MFC三种不同方式实现图形的保存和重绘---方法二: 运用CMetaFileDC

在OnButtonUp()函数中的代码 //选中透明画刷 CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); m_mfDc.SelectObject(brush); //m_mfDc为CMetaFileDC对象,全局的 //通过m_mfDc绘图 switch(m_gType) {