Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现。

基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘。(文章较长,但是代码是逐步递进的,可以按三部分分开来看,实现了当前部分再去看下一部分。)首先是画板的界面实现,因为我没有去找具体的图标,界面上的所有组件都是Swing的自带组件,所以界面略微有点简陋,不过如果想要优化也简单,把界面上的组件都改成自定义的图标即可。界面实现后,就可以考虑给界面的组件加上监听,不同的图形根据具体情况添加不同的监听方法。然后编写事件处理类依据不同的图形编写画图的具体算法。一个简易版本的画图板基本就差不多可以实现了。重绘这里先不提放到后面再讲。

先来看看画图界面的实现:

实现画图界面需要用的API类主要有:FlowLayout,GridLayout,Color,Dimension,JButton,JFrame,JPanel。

定义Draw类,让Draw类继承JFrame。设置它的大小,标题,可见性等。需要注意的是这里如果添加的按钮如果比较多,建议使用数组来完成按钮的添加,因为如果直接一个一个的加按钮,不仅会使得代码量增大,而且不利于查找、添加和代码的维护。为了使得界面不至于显得那么简陋,这里使用了几个Jpanel,和不同的布局管理器。主窗体使用的是流式布局管理器,然后使用三个面板,分别承装图形按钮,颜色按钮和画布。承装图形按钮和颜色按钮的面板都使用表格布局。然后界面的实现就基本完成了。

package Cbs;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.GridLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

/**

* Draw类,用于界面的初始化

* @author CBS

*/

@SuppressWarnings("serial")

public class Draw extends JFrame {

// 界面初始化方法

public void showUI() {

setTitle("画图");//窗体名称

setSize(1200, 900);//窗体大小

setDefaultCloseOperation(3);

setLocationRelativeTo(null);//窗体居中

//流式布局左对齐

FlowLayout layout = new FlowLayout(FlowLayout.LEFT);

setLayout(layout);//窗体使用流式布局管理器

this.setResizable(false);//窗体大小不变

//使用数组保存按钮名

String buttonName[] = { "画直线", "画椭圆", "画曲线", "多边形",

"橡皮擦", "拖动线","三角形", "画球形", "笔刷", "喷枪",

"色子", "立体矩形", "立体圆", "立体三角","迭代分形",

"现代分形", "枫叶", "画树", "mandelbrot集", "L-System",

"迭代画线","迭代三角形", "谢尔宾斯基地毯", "画字符", "清空",

"吸管" ,"矩形","五角星","多线","字符"};

//用于保存图形按钮,使用网格布局

JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));

jp1.setPreferredSize(new Dimension(200, 800));

//循环为按钮面板添加按钮

for (int i = 0; i < buttonName.length; i++) {

JButton jbutton = new JButton(buttonName[i]);

jp1.add(jbutton);

}

JPanel jp2=new JPanel();//画布面板

jp2.setPreferredSize(new Dimension(970, 800));

jp2.setBackground(Color.WHITE);

// 定义Color数组,用来存储按钮上要显示的颜色信息

Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED,

Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,

Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,

Color.LIGHT_GRAY,Color.YELLOW};

//用于保存颜色按钮的面板

JPanel jp3=newJPanel(newGridLayout(1,colorArray.length,3,3));

// 循环遍历colorArray数组,根据数组中的元素来实例化按钮对象

for (int i = 0; i < colorArray.length; i++) {

JButton button = new JButton();

button.setBackground(colorArray[i]);

button.setPreferredSize(new Dimension(30, 30));

jp3.add(button);

}

//将面板添加到主窗体

this.add(jp1);

this.add(jp2);

this.add(jp3);

//添加按钮,作为当前颜色

JButton nowColor=new JButton();

nowColor.setPreferredSize(new Dimension(40,40));

nowColor.setBackground(Color.BLACK);//默认黑色

add(nowColor);

//设置窗体的组件可见,如果为FALSE就看不到任何组件

setVisible(true);

}

}

这里还要一点要注意的地方,Jpanel面板的添加先后顺序不要改变,这是根据流式布局算出来的面板大小,读者可以自行更改调试。还有一个就是窗体的setSize方法只对窗体本身有效,如果要改变其他组件的大小要用setPreferredSize方法。这样画图板的基本界面就实现。界面的按钮和面板可以根据自身需要更改。

这是界面的大概样子:

监听的实现:

当然我们空有个界面并没有什么用,我们需要的是点击不同的按钮能够实现不同的功能。这里就需要用到事件的监听机制了。实现监听的主要API类有: ActionListener,MouseListener,MouseMotionListener。添加事件监听的方法根以前的步骤是一样的:确定事件源对象,编写事件处理类,添加监听方法。画图板中的事件源对象有两种,一种是按钮,另一种就是画布的面板,按钮使用的是ActionListener,而画布面板因为负责的是绘图,所以使用的是MouseListener和MouseMotionListener。为了实现事件的监听,我们需要定义一个事件处理类DrawListener,该类实现了以上的三个事件接口。之后在重写的方法中实现不同图形的绘制。图形的绘制都可以通过Graphics对象的方法来实现。但是这里有一个问题,如何分辨在Draw类中按下的是哪个按钮呢?在定义Draw类的时候,我们使用了图形按钮和颜色按钮,图形类的按钮在实例化对象的时候是使用了带参数的构造方法的,也就是图形按钮都是有文字的,而颜色按钮则没有。依据这一点就可以很容易的区分不同的按钮了。

DrawListener类:

package Cbs;

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 java.awt.event.MouseMotionListener;

import javax.swing.JButton;

public class DrawListener implements ActionListener, MouseListener,

MouseMotionListener {

private Color color;//颜色属性

private Graphics g;//画笔属性

private String str;//保存按钮上的字符串,区分不同的按钮

private int x1,y1,x2,y2;//(x1,y1),(x2,y2)分别为鼠标的按下和释放时的坐标

private JButton nowColor;//当前颜色按钮

//获取Draw类的画笔对象

public void setG(Graphics g) {

this.g = g;

}

//获取当前颜色按钮

public void setNowColor(JButton nowColor) {

this.nowColor = nowColor;

}

@Override

//鼠标拖动的方法

public void mouseDragged(MouseEvent e) {

//画曲线的方法

if ("画曲线".equals(str)) {

int x, y;

x = e.getX();

y = e.getY();

g.drawLine(x, y, x1, y1);

x1 = x;

y1 = y;

}

}

@Override

//鼠标移动方法

public void mouseMoved(MouseEvent e) {

}

@Override

//鼠标单击方法

public void mouseClicked(MouseEvent e) {

}

@Override

//鼠标按下方法

public void mousePressed(MouseEvent e) {

g.setColor(color);//改变画笔的颜色

x1=e.getX();//获取按下时鼠标的x坐标

y1=e.getY();//获取按下时鼠标的y坐标

}

@Override

//鼠标释放方法

public void mouseReleased(MouseEvent e) {

x2=e.getX();//获取释放时鼠标的x坐标

y2=e.getY();//获取释放时鼠标的y坐标

//画直线的方法

if ("画直线".equals(str)) {

g.drawLine(x1, y1, x2, y2);

}

}

@Override

//鼠标进入方法

public void mouseEntered(MouseEvent e) {

}

@Override

//鼠标退出方法

public void mouseExited(MouseEvent e) {

}

@Override

//处理按钮上的鼠标点击动作

public void actionPerformed(ActionEvent e) {

//判断是颜色按钮还是图形按钮

if ("".equals(e.getActionCommand())) {

JButton jb = (JButton) e.getSource();

color = jb.getBackground();

nowColor.setBackground(color);//处理当前颜色

} else {

str = e.getActionCommand();

}

}

}

Draw类也要做一些修改,为按钮和面板添加监听:

package Cbs;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.GridLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

/**

* Draw类,用于界面的初始化

* @author CBS

*/

@SuppressWarnings("serial")

public class Draw extends JFrame {

private DrawListener dl;

private Graphics g;

// 界面初始化方法

public void showUI() {

setTitle("画图");//窗体名称

setSize(1200, 900);//窗体大小

setDefaultCloseOperation(3);

setLocationRelativeTo(null);//窗体居中

//流式布局左对齐

FlowLayout layout = new FlowLayout(FlowLayout.LEFT);

setLayout(layout);//窗体使用流式布局管理器

this.setResizable(false);//窗体大小不变

//使用数组保存按钮名

String buttonName[] = { "画直线", "画椭圆", "画曲线", "多边形",

"橡皮擦", "拖动线","三角形", "画球形", "笔刷", "喷枪",

"色子", "立体矩形", "立体圆", "立体三角","迭代分形",

"现代分形", "枫叶", "画树", "mandelbrot集", "L-System",

"迭代画线","迭代三角形", "谢尔宾斯基地毯", "画字符", "清空",

"吸管" ,"矩形","五角星","多线","字符"};

//用于保存图形按钮,使用网格布局

JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));

jp1.setPreferredSize(new Dimension(200, 800));

//实例化DrawListener对象

dl=new DrawListener();

//循环为按钮面板添加按钮

for (int i = 0; i < buttonName.length; i++) {

JButton jbutton = new JButton(buttonName[i]);

jbutton.addActionListener(dl);//为按钮添加监听

jp1.add(jbutton);

}

JPanel jp2=new JPanel();//画布面板

jp2.setPreferredSize(new Dimension(970, 800));

jp2.setBackground(Color.WHITE);

// 定义Color数组,用来存储按钮上要显示的颜色信息

Color[] colorArray = { Color.BLUE, Color.GREEN,

Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,

Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY,

Color.YELLOW};

//用于保存颜色按钮的面板

JPanel jp3=new JPanel(new GridLayout(1,colorArray.length,3,3));

// 循环遍历colorArray数组,根据数组中的元素来实例化按钮对象

for (int i = 0; i < colorArray.length; i++) {

JButton button = new JButton();

button.setBackground(colorArray[i]);

button.setPreferredSize(new Dimension(30, 30));

button.addActionListener(dl);//为按钮添加监听

jp3.add(button);

}

//将面板添加到主窗体

this.add(jp1);

this.add(jp2);

this.add(jp3);

//添加按钮,作为当前颜色

JButton nowColor=new JButton();

nowColor.setPreferredSize(new Dimension(40,40));

nowColor.setBackground(Color.BLACK);//默认黑色

add(nowColor);

//设置窗体的组件可见,如果为FALSE就看不到任何组件

setVisible(true);

//获取画笔对象

g=jp2.getGraphics();

dl.setG(g);

dl.setNowColor(nowColor);

//为面板添加鼠标监听,用于绘制图形

jp2.addMouseListener(dl);

jp2.addMouseMotionListener(dl);

}

}

drawDrawListener里面只写了画直线和曲线的方法,读者可以根据自己的需求添加,思路和方式都是一样的。Draw类里面有些需要注意的地方在这里提一下:一个是画笔g的获取一定要在窗体的可见之后采取获取,不然获取的画笔对象返回值会是null。二是要为图形按钮添加监听,DrawListener的实例化需要在setVisible方法之前,所以不建议使用构造方法直接传入g画笔参数,我使用的是set方法。最后是注意一下使用哪个添加方法,按钮使用的是addActionListener方法,画板面板使用的是addMouseListener和addMouseMotionListener方法。使用画板面板来获取画笔并给画面面板添加监听是为了让绘图的时候图形不会跑出面板外,这里的画笔和监听都由主窗体获得也是可以的,不过绘制时会出现线画出面板的问题。

画板的重绘:

到这里画板的制作已经基本实现了,我们已经可以在上面绘制各种各样的图形了。但是细心的人可能会发现一个问题,那就是如果把窗体最小化之后再次打开,画板上原本已经画好的东西会全部都消失了。这样子肯定是不行的,辛辛苦苦画的“大作”怎么能说说没就没了呢。那么为什么会出现这样的问题呢?要回答这个问题我们就需要先了解Java的绘图机制。做画图板我们使用的是Swing组件,这套组件是基于原先的AWT组件开发,在绘制的时候会调用系统的画图函数,这就是为什么我们可以从面板或者是窗体中获取画笔对象的原因。这也就是说Java中你所能够看到窗体,按钮或者其它的所有组件其实都是画出来。所以当我们点击窗体使它最小化或者改变大小的时候,原来的画的窗体就不能适应需要了,这时系统会调用JFrame的paint方法实现窗体的重绘,也就是再次画了一个新的窗体,而JFrame的paint方法只对窗体已经添加的组件有效,我们自己绘制的东西并没有写在paint方法里面,所以窗体重绘之后,我们原先绘制的图形也就消失了。要解决这个问题我们需要重写父类的paint方法。但是这样的话问题又来了,画图是在DrawListener类里面实现的,要怎么把它们弄到paint方法里面去呢?

当然方法可能有很多,这里我只介绍我所知道的:要把画出来的图形在paint方法中再次画出来,就需要有东西来保存画过的图形。保存可以使用数组或者集合,这里推荐使用集合,可以很方便的实现添加,而不需要去考虑大小的问题。数组的实现也大同小异,这里就不多做介绍。确定了使用集合,那么集合内保存什么类型的数据呢?毫无疑问应该保存的是图形的数据,但是集合使用泛型的话也只能保存同一种类型的数据,我们却有那么多种图形?这里就可以使用接口或者抽象类,我们只需要创建不同得图形类,让它继承抽象类或者是实现接口。然后每画一个图形就实例化一个图形的对象,存入集合中,最后在paint方法中遍历集合,重新绘制图形即可。

下面直接贴最终代码(仍然只写了直线和曲线),只是添加了几行代码,注意与前面比较。

//图形接口

package Cbs;

//图形集合

public interface NetJavaShape {

public abstract void draw();

}

//直线类

package Cbs;

import java.awt.Color;

import java.awt.Graphics;

import Cbs.NetJavaShape;

public class ImpLine implements NetJavaShape{

Graphics g;

int x1, y1,x2, y2;

Color c;

public ImpLine(Graphics g,int x1,int y1,int x2,int y2,Color c){

this.g=g;

this.c=c;

this.x1=x1;

this.y1=y1;

this.x2=x2;

this.y2=y2;

}

public void draw() {

g.setColor(c);

g.drawLine(x1, y1, x2, y2);

}

}

//DrawListener类

package Cbs;

import java.awt.Color;

import java.awt.Graphics;

import java.util.List;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.util.ArrayList;

import Cbs.NetJavaShape;

import javax.swing.JButton;

public class DrawListener implements ActionListener, MouseListener,

MouseMotionListener {

private Color color=Color.BLACK;//颜色属性,初始值为黑色

private Graphics g;//画笔属性

private String str;//保存按钮上的字符串,区分不同的按钮

private int x1,y1,x2,y2;//(x1,y1),(x2,y2)分别为鼠标的按下和释放时的坐标

private JButton nowColor;//当前颜色按钮

//保存图形对象的集合

private List shapesArray = new ArrayList();

//图形

private NetJavaShape shape;

//在draw类中获取集合

public List getShapesArray() {

return shapesArray;

}

//获取Draw类的画笔对象

public void setG(Graphics g) {

this.g = g;

}

//获取当前颜色按钮

public void setNowColor(JButton nowColor) {

this.nowColor = nowColor;

}

@Override

//鼠标拖动的方法

public void mouseDragged(MouseEvent e) {

//画曲线的方法

if ("画曲线".equals(str)) {

int x, y;

x = e.getX();

y = e.getY();

//实例化对象,曲线也是直线画的所以不同新建一个曲线类了

shape=new ImpLine(g,x,y,x1,y1,color);

//调用画图方法

shape.draw();

//将图形存入集合中

shapesArray.add(shape);

// g.drawLine(x, y, x1, y1);

x1 = x;

y1 = y;

}

}

@Override

//鼠标移动方法

public void mouseMoved(MouseEvent e) {

}

@Override

//鼠标单击方法

public void mouseClicked(MouseEvent e) {

}

@Override

//鼠标按下方法

public void mousePressed(MouseEvent e) {

g.setColor(color);//改变画笔的颜色

x1=e.getX();//获取按下时鼠标的x坐标

y1=e.getY();//获取按下时鼠标的y坐标

}

@Override

//鼠标释放方法

public void mouseReleased(MouseEvent e) {

x2=e.getX();//获取释放时鼠标的x坐标

y2=e.getY();//获取释放时鼠标的y坐标

//画直线的方法

if ("画直线".equals(str)) {

//实例化对象,

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

//调用画图方法

shape.draw();

//将图形存入集合中

shapesArray.add(shape);

// g.drawLine(x1, y1, x2, y2);

}

}

@Override

//鼠标进入方法

public void mouseEntered(MouseEvent e) {

}

@Override

//鼠标退出方法

public void mouseExited(MouseEvent e) {

}

@Override

//处理按钮上的鼠标点击动作

public void actionPerformed(ActionEvent e) {

if ("".equals(e.getActionCommand())) {

JButton jb = (JButton) e.getSource();

color = jb.getBackground();

nowColor.setBackground(color);//处理当前颜色

} else {

str = e.getActionCommand();

}

}

}

//draw类

package Cbs;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.GridLayout;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

/**

* Draw类,用于界面的初始化

* @author CBS

*/

@SuppressWarnings("serial")

public class Draw extends JFrame {

private DrawListener dl;

private Graphics g;

//保存图形对象的集合

private List shapesArray = new ArrayList();

// 界面初始化方法

public void showUI() {

setTitle("画图");//窗体名称

setSize(1200, 900);//窗体大小

setDefaultCloseOperation(3);

setLocationRelativeTo(null);//窗体居中

FlowLayout layout = new FlowLayout(FlowLayout.LEFT);//流式布局左对齐

setLayout(layout);//窗体使用流式布局管理器

this.setResizable(false);//窗体大小不变

//使用数组保存按钮名

String buttonName[] = { "画直线", "画椭圆", "画曲线", "多边形", "橡皮擦", "拖动线","三角形", "画球形", "笔刷", "喷枪", "色子", "立体矩形", "立体圆", "立体三角","迭代分形", "现代分形", "枫叶", "画树", "mandelbrot集", "L-System", "迭代画线","迭代三角形", "谢尔宾斯基地毯", "画字符", "清空","吸管" ,"矩形","五角星","多线","字符"};

JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));//用于保存图形按钮,使用网格布局

jp1.setPreferredSize(new Dimension(200, 800));

//实例化DrawListener对象

dl=new DrawListener();

//循环为按钮面板添加按钮

for (int i = 0; i < buttonName.length; i++) {

JButton jbutton = new JButton(buttonName[i]);

jbutton.addActionListener(dl);//为按钮添加监听

jp1.add(jbutton);

}

JPanel jp2=new JPanel();//画布面板

jp2.setPreferredSize(new Dimension(970, 800));

jp2.setBackground(Color.WHITE);

// 定义Color数组,用来存储按钮上要显示的颜色信息

Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY,Color.YELLOW};

//用于保存颜色按钮的面板

JPanel jp3=new JPanel(new GridLayout(1,colorArray.length,3,3));

// 循环遍历colorArray数组,根据数组中的元素来实例化按钮对象

for (int i = 0; i < colorArray.length; i++) {

JButton button = new JButton();

button.setBackground(colorArray[i]);

button.setPreferredSize(new Dimension(30, 30));

button.addActionListener(dl);//为按钮添加监听

jp3.add(button);

}

//将面板添加到主窗体

this.add(jp1);

this.add(jp2);

this.add(jp3);

//添加按钮,作为当前颜色

JButton nowColor=new JButton();

nowColor.setPreferredSize(new Dimension(40,40));

nowColor.setBackground(Color.BLACK);//默认黑色

add(nowColor);

//设置窗体的组件可见,如果为FALSE就看不到任何组件

setVisible(true);

//获取画笔对象

g=jp2.getGraphics();

dl.setG(g);

dl.setNowColor(nowColor);

//获取保存的集合

shapesArray=dl.getShapesArray();

//为面板添加鼠标监听,用于绘制图形

jp2.addMouseListener(dl);

jp2.addMouseMotionListener(dl);

}

@Override

//重写paint方法

public void paint(Graphics g) {

//调用父类的paint方法,绘制界面上的组件

super.paint(g);

//foreach遍历集合

for (NetJavaShape l : shapesArray) {

l.draw();

}

}

}

这里使用集合添加图形实现画板的重绘时,我是每实现一个图形就会新建一个类来保存图形的信息,这样图形类就会有很多。如果不想创建那么多的图形类可以把它们都放到一个类里面,设置一个type的参数,赋上按钮的名称。然后在draw方法中依据这个值判断是什么图形实现不同的画图方法。这样画板的所有功能基本就实现了,画板的项目也就到这里。

总结:

画图板的制作重要用到了Swing的组件,事件监听机制,Graphics绘图和画板的重绘以及集合的使用,抽象类或者是接口作为规范图形类的作用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java创建画板_Java版画板的实现方法相关推荐

  1. Java创建并执行线程的四种方法

    Java创建并执行线程的四种方法 java里面创建线程有四种方式: 无返回: 实现Runnable接口,重写run(); 继承Thread类,重写run(); 有返回: 实现Callable接口,重写 ...

  2. java 创建多线程_Java创建多线程

    Java创建多线程 下一节> 到目前为止,我们仅用到两个线程:主线程和一个子线程.然而,你的程序可以创建所需的更多线程.例如,下面的程序创建了三个子线程: // Create multiple ...

  3. java创建树结构_Java学习之XML-017

    如果想快速有效的学习,思想核心是"以建立知识体系为核心",具体方法是"守破离".反复练习直到熟练.----百战程序员 1.0 XML 1.1 XML 简介 XM ...

  4. java创建型_Java创建型模式

    Java创建型模式 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象.基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度.创建型模式通过以某种方式控制 ...

  5. java拆分日期_java实现日期拆分的方法

    java实现日期拆分的方法 本文实例讲述了java实现日期拆分的方法.分享给大家供大家参考.具体如下: 如:计算6-1至6-5之间的日期天数及具体日期,预期的结果是得到: 6-1 6-2 6-3 6- ...

  6. java 释放一个对象_JAVA中销毁一个对象的方法

    方法一:垃圾回收器 垃圾回收器是Java平台中用的最频繁的一种对象销毁方法.垃圾回收器会全程侦测Java应用程序的运行情况.当反先有些对象成为垃圾时,垃圾回收器就会销毁这些对象,并释放这些对象所占用的 ...

  7. java wait 参数_java中wait()和join()方法的区别是什么

    java中wait()和join()方法的区别是:存在不同的java包中:wait()方法用于线程间通信,它所施加的等待状态的线程可以被启动:join()方法用于在多个线程之间添加排序,它所施加的等待 ...

  8. 用java编写一个简易功能画板_Java版简易画图板的实现

    //图形接口 packageCbs;//图形集合 public interfaceNetJavaShape {public abstract voiddraw(); }//直线类 packageCbs ...

  9. java 渐变橡皮擦_java 的画板上面的一个橡皮檫功能

    importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;classToolBarextendsJPanel{//工具条Image[]im ...

最新文章

  1. Deep learning调参经验
  2. java直接调用复制文件,java中文件复制的4种方式,java文件的复制
  3. 清华校长送给毕业生的五句话,值得一看!
  4. dev c++怎么设置断点_Linux怎么挂载移动硬盘光盘U盘之案例分享
  5. linux runqueue定义,linux – 了解rt_rq(实时runqueue)内核中数据成员的使用
  6. 数十亿次数学运算只消耗几毫瓦电力,谷歌开源Pixel 4背后的视觉模型
  7. 怎么将layui导入php中,layui怎么导入Excel
  8. JavaScript笔记 - 对象继承的几种方式
  9. 美国国土安全部发布针对高风险铁路基础设施的强制性安全要求
  10. Python中的目录树列表
  11. vue/iview使用moment.js
  12. 凸包+旋转卡壳模板——kuangbin版
  13. C语言中的volatile三种作用,volatile关键字在嵌入式C语言中的使用
  14. 【转】关于PCI和PCIE
  15. preg_replace函数去除字符串中的空格,逗号(,)等
  16. cython(cython安装)
  17. 小米手机冻结智能服务以减少系统开屏广告
  18. 中小企业比08年还难 浙江企业扎堆倒闭
  19. MicroService
  20. 基于android的健身管理APP系统-计算机毕业设计

热门文章

  1. java实现微博热搜榜_微博热搜数据监测
  2. JDK1.8下载安装配置
  3. 关于工作经验积累到底是积累的什么?
  4. Xv6 文件系统接口
  5. ai怎样导出所选部分,AI 怎么导出部分文件
  6. 1.Linux目录管理
  7. 如何删除.git目录
  8. 人人都应该用的 Python 开源库
  9. 初级开发人员的缺点_初级开发人员应阅读的书籍
  10. Redis监控和预警