`
612星球
  • 浏览: 9350 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

七.重绘

阅读更多
为什么要重绘?
缓存
int array[] = new int[0];

//实现数组动态变化,也就是每次执行该方法时数组的长度加1
public void add(int a){
//创建一个新的数组,长度为array数组长度加1
int[] array2 = new int[array.length+1];
//循环拷贝
for(int i=0;i<array.length;i++){
array2[i] = array[i];
}
//把a的值赋给array2数组的最后一个元素
array2[array.length] = a;
//数组交换
array = array2;
}

例:
MyFrame.java

package cn.netjava.repaint;

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
* 窗体类
* @author ssss
*
*/
public class MyFrame extends JFrame{
//定义属性
Graphics g;
String command;

/** 主函数 */
public static void main(String[] args){
//实例化MyFrame对象
MyFrame mf = new MyFrame();
//调用显示窗体的方法
mf.showUI();
}

/** 显示窗体的方法 */
public void showUI(){
//设置窗体的标题
this.setTitle("简单窗体");
//设置窗体的大小
this.setSize(400,400);
//设置窗体显示位置居中
this.setLocationRelativeTo(null);
//设置窗体关闭时程序退出
this.setDefaultCloseOperation(3);
//设置窗体布局
this.setLayout(new FlowLayout());

//添加按钮
JButton btn_line = new JButton("line");
JButton btn_rect = new JButton("rect");
JButton btn_oval = new JButton("oval");

this.add(btn_line);
this.add(btn_rect);
this.add(btn_oval);

//以匿名内部类的形式创建事件监听器对象
ActionListener listener1 = new ActionListener(){

public void actionPerformed(ActionEvent e){
//获取动作命令,让计算机知道我们是点击了哪个按钮
command = e.getActionCommand();
}
};

btn_line.addActionListener(listener1);
btn_rect.addActionListener(listener1);
btn_oval.addActionListener(listener1);




//设置窗体可见
this.setVisible(true);
//获取画布对象
g = this.getGraphics();

//以匿名内部类的形式创建一个鼠标监听器对象
MouseListener listener = new MouseAdapter(){
//定义坐标
int x1,y1,x2,y2;

//重写我们需要的方法
//鼠标按下时的操作
public void mousePressed(MouseEvent e){

x1 = e.getX();
y1 = e.getY();
}

//鼠标释放时的操作
public void mouseReleased(MouseEvent e){
x2 = e.getX();
y2 = e.getY();

Shape shape = new ImpLine(x1,y1,x2,y2);

//判断
if("line".equals(command)){
shape = new ImpLine(x1,y1,x2,y2);
}else if("rect".equals(command)){
shape = new ImpRect(x1,y1,x2,y2);
}else if("oval".equals(command)){
shape = new ImpOval(x1,y1,x2,y2);
}

//调用画图的方法
shape.draw(g);

MyList.add(shape);
}
};

//给窗体添加鼠标监听
this.addMouseListener(listener);

}


/** 重绘的方法 */
public void paint(Graphics g){
super.paint(g);

Shape[] shapes = MyList.array;
for(int i=0;i<shapes.length;i++){
shapes[i].draw(g);
}
}
}

MyList.java

package cn.netjava.repaint;
/**
* 队列类
* @author ssss
*
*/
public class MyList {
//定义整型数组
static Shape[] array = new Shape[0];

//实现数组动态变化,也就是每次执行该方法时数组的长度加1
public static void add(Shape shape){
//创建一个新的数组,长度为array数组长度加1
Shape[] array2 = new Shape[array.length+1];
//循环拷贝
for(int i=0;i<array.length;i++){
array2[i] = array[i];
}
//把a的值赋给array2数组的最后一个元素
array2[array.length] = shape;
//数组交换
array = array2;
}

Shape.java

package cn.netjava.repaint;

import java.awt.Graphics;

/**
* 抽象类
* @author ssss
*
*/
public abstract class Shape {
//定义共有属性
public int x1,y1,x2,y2;

//定义抽象方法
abstract void draw(Graphics g);

}

ImpLine.java

package cn.netjava.repaint;

import java.awt.Graphics;

/**
* 画直线的类,继承Shape类
* @author ssss
*
*/
public class ImpLine extends Shape{


//构造方法
public ImpLine(int x1,int y1,int x2,int y2){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}


//实现抽象方法draw()
public void draw(Graphics g){
g.drawLine(x1, y1, x2, y2);
}
}

ImpOval.java

package cn.netjava.repaint;

import java.awt.Graphics;
/**
* 画椭圆的类,继承Shape类
* @author ssss
*
*/
public class ImpOval extends Shape{
//构造方法
public ImpOval(int x1,int y1,int x2,int y2){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}


//实现抽象方法draw()
public void draw(Graphics g){
g.drawOval(x1, y1, x2, y2);
}
}

ImpRect.java

package cn.netjava.repaint;

import java.awt.Graphics;
/**
* 画矩形的类,继承Shape类
* @author ssss
*
*/
public class ImpRect extends Shape{


//构造方法
public ImpRect(int x1,int y1,int x2,int y2){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}


//实现抽象方法draw()
public void draw(Graphics g){
g.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
}
}


分享到:
评论

相关推荐

    MATLAB使用教程

    matlab教程 有源码,内容如下: 第一章MATLAB环境.................................. 1 用户界面概述..........................................................................................................

    PT80-NEAT开发指南v1.1

    NEAT 开 发 指南 文档 适用于 PT80 系列 移动数据终端 版本记录 版本号 版本描述 发布日期 V 1.0 初始版本。 2012-04-12 V1.1 修改前三章内容 2012-09-25 目录 第一章 关于本手册.....................................

    【菜单控件CMenu】控件应用第二十七课

    【菜单控件CMenu】控件应用第二十七课,完整的菜单重绘,讲解代码http://www.gymsaga.com/project/573.html

    Linux操作系统基础教程

    最重 要的是,Linux 上有公认的 C 语言世界最好的编译器 gcc,如果你想得到一个效率更高的开 发环境(并不一定是最友好的,但一定是最强大的),我建议你一定要好好的熟悉一下 Linux。 三.如何得到Linux? 据我...

    C# WinForm控件美化之ImageComboBox

    这篇文章中我们重点需要实现的是(3)、(4)两项功能,下面我们来介绍具体实现的方法。 第一步,实现ImageComboBoxItem类。 要实现显示图标,当然要给每个项添加与图标相关的信息了,ImageComboBoxItem类应该包括...

    infinity_新标签页.zip(内附安装说明)

    相比Chrome自带的新标签页,您可以通过Infinity自定义添加自己喜爱的网站,我们重绘了上千图标,当然您也可以自定义这些网站的图标。除此之外,您还可以更新新标签页的背景图片,既可以使用您自己的图片,也可以使用...

    《Stable Diffution小白超神之路》超详细AI绘画实操课,手把手带你掌握Stable Diffution商业级玩法

    免费白嫖玩法(详细)、保姆级详细教程、轻理论重实操、最新商业级别AI绘画教程。 三、适合人群 适合完全没有接触过Stable Diffution的新手小白和有AI绘画进阶。从认识到学会。从学会到实践,从实践到商业应用...

    数码管 (LED) 显示 类

    内部不含自动重画功能,故调用者应自己处理窗口重绘时字符的重新显示. d.字符串内不能同时含 ":"与"." ,可以只含其中一个字符. e.能显示的字符包括 0-9,a-f,A-F,".",":","-" f.居中显示时设置m_bFillFullRect=true...

    《Visual C++范例大全》随书光盘 第七章

    实例146——在视图中使用CPaintDC进行进行窗口重绘操作 实例147——在视图中使用CWindowDC在整个窗口进行绘图 实例148——在对话框窗口中进行绘图操作 实例149——创建字体进行文本输出 实例150——制作简单的...

    孙鑫C++教程(全20讲)PPT讲义源码及电子书

    第十一课:图形的 保存和重绘 第十二课:文件操作 第十三课:文档与串行化 第十四课:网络相关知识 第十五课:多线程与聊天室程序的创建 第十六课:线程同步与异步套接字编程 第十七课:进程间通信 第十八课:ActiveX控件 第...

    Led 显示 类 数码管

    内部不含自动重画功能,故调用者应自己处理窗口重绘时字符的重新显示. d.字符串内不能同时含 ":"与"." ,可以只含其中一个字符. e.能显示的字符包括 0-9,a-f,A-F,".",":","-" f.居中显示时设置m_bFillFullRect=true...

    LED 数码管 显示 类

    内部不含自动重画功能,故调用者应自己处理窗口重绘时字符的重新显示. d.字符串内可同时含 ":"与"." ,但字符串左起第一个字符不能为":"或"." ,且不能连续两个小数点或冒号!! e.能显示的字符包括 0-9,a-f,A-F,".",":...

    MFC教程入门知识全集.rar

    第七章 对话框和控件 7.1 对话框及控件的介绍 7.1.1 常用控件介绍 7.1.2 对话框介绍 7.1.2.1 对话框的组成 7.1.2.2 对话框的种类 7.1.2.3 使用对话框编辑器设计对话框 7.1.3 创建一个对话框 7.1.3.2 创建非...

    ASP.NET3.5从入门到精通

    目录 第一篇 .NET基础 第 1 章认识 ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET 历史与展望 1.1.2 ASP.NET 与ASP 1.1.3 ASP.NET 开发工具 1.1.4 ASP.NET 客户端 1.1.5 ASP.NET 3.5 新增控件 1.1.6 ASP.NET 3.5 AJAX ...

    深入浅出 MFC (第二版) 高清晰

    第十一章 Vies功能的加强与重绘效率的提高 第十二章 打印与预览 第十三章 多重文件与多重视图 第十四章 MFC 多线程程序设计 第十五章 站在众人的肩膀――使用Components & ActiveX Controls 第五篇 附录 · · · ·...

    Led 显示 类 数码管 数码 数字

    内部不含自动重画功能,故调用者应自己处理窗口重绘时字符的重新显示. d.字符串内可同时含 ":"与"." ,但字符串左起第一个字符不能为":"或"." ,且不能连续两个不点位符号,如小数点或冒号!! e.能显示的字符包括 0-9,a...

Global site tag (gtag.js) - Google Analytics