画板(加监听,重绘)

画板(加监听,重绘)

此次画板较比上次增加了监听和重绘,并实现了一些功能。在实现撤销时应该注意的是,画笔、喷枪、橡皮要独立封装成一个类,因为铅笔与喷枪等都是有一个个点来绘制的,不封装的话会出现撤销很不明显的状况。

DrawBoard作为主函数,用来实现MainFrame的调用:

MainFrame mf = new MainFrame();

mf.ShowUI();

MainFrame中有几个方法:

public void ShowUI();//ShowUI方法

private void addListener() ;//添加监听

private void addDrawPanel();//在其中引用绘制面板

private void addColorsPanel();//在其中引用颜色面板

private void addToolsPanel();//在其中引用工具面板

private void creatMenu();//创建菜单、菜单栏、菜单项

public void init();//设置界面的一些基础操作

较上次在ShowUI()多添加了一个监听:

addListener();

DrawPanel中添加图形容器,用来paint()方法的重写:

static ShapeContainer ls = new ShapeContainer();

Shape.java文件是一个接口,可以被其他类实现;

ShapeContainer是一个图形容器,

在其中保存所选择的图形,方法有:

public void add(Shape sp);

public Shape get(int index);

public void remove(int index);

ToolsPanel实现窗口左边的工具栏,添加图标,设置边界,背景,边框,布局等:

//设置左边边界大小
setPreferredSize(new Dimension(60,0));

//设置背景颜色

setBackground(new Color(240,240,240));

//在中间创建流式布局

setLayout(new FlowLayout(FlowLayout.CENTER,0,0));

//创建一个向上凸起的边框

BevelBorder border = new BevelBorder(BevelBorder.RAISED, new Color(240,240,240),new Color(160,160,160));

setBorder(border);

//创建一个按钮组,使所有按钮能够互斥

ButtonGroup bg = new ButtonGroup();

ToolsActionListener中添加一个工具监听:

public void actionPerformed(ActionEvent e) {

String actionCommand = e.getActionCommand();

mainFrame.setsTool(actionCommand);

 

}

DrawMouseListener中通过Switch语句来执行所选择工具的一系列实行,

主要用到的方法有:

public void mouseClicked(MouseEvent e);

public void mousePressed(MouseEvent e);

public void mouseReleased(MouseEvent e);

下面给出具体代码:

ColorActionListener:

package HUABAN0;

 

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

 

import javax.swing.JButton;

 

public class ColorActionListener implements MouseListener {

 

MainFrame mainFrame;

 

public ColorActionListener(MainFrame mainFrame) {

this.mainFrame = mainFrame;

}

@Override

public void mouseClicked(MouseEvent e) {

//获取事件源==》按钮

//获取鼠标按钮1左键,3右键

int button = e.getButton();

System.out.println(button);

Object source = e.getSource();

//强制转换为JButton

if(source instanceof JButton)

{

JButton jbt = (JButton)source;

System.out.println(jbt.getBackground());

if(button == 1)

{

mainFrame.setBkColor(jbt.getBackground());

mainFrame.colorsPanel.changeSelectedBKColor(jbt.getBackground());

}

else if(button == 3)

{

mainFrame.setTcColor(jbt.getBackground());

mainFrame.colorsPanel.changeSelectedTCColor(jbt.getBackground());

}

}

}

@Override

public void mouseEntered(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseReleased(MouseEvent e) {

// TODO Auto-generated method stub

}

}

 

ColorsPanel :

package HUABAN0;

 

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

 

import javax.swing.JButton;

import javax.swing.JPanel;

import javax.swing.border.BevelBorder;

import javax.swing.border.EmptyBorder;

import javax.swing.border.LineBorder;

 

@SuppressWarnings("serial")

public class ColorsPanel extends JPanel{

MainFrame mainFrame;

private JButton jbt1;

private JButton jbt2;

//增加颜色数组

Color[]colors = {

new Color(0, 0, 0),new Color(128, 128, 128),

new Color(128, 0, 0), new Color(128, 128, 0),

new Color(0, 128, 0),new Color(0, 128, 128),

new Color(0, 0, 128),new Color(128, 0, 128),

new Color(128, 128, 64),

new Color(0, 64, 64), new Color(0, 128, 255),

new Color(0, 64, 128), new Color(128, 0, 255),

new Color(128, 64, 0), new Color(255, 255, 255),

new Color(192, 192, 192), new Color(255, 0, 0),

new Color(255, 255, 0), new Color(0, 255, 0),

new Color(0, 255, 255), new Color(0, 0, 255),

new Color(255, 0, 255), new Color(255, 255, 128),

new Color(0, 255, 128), new Color(128, 255, 255),

new Color(128, 128, 255), new Color(255, 0, 128),

new Color(255, 128, 64)

};

public ColorsPanel(MainFrame mainFrame){

this.mainFrame = mainFrame;

//设置颜色面板大小

setPreferredSize(new Dimension(0, 50));//轻量级组建大小

//设置线框颜色

setBorder(new LineBorder(Color.GRAY));

//设置位置(流式布局)

setLayout(new FlowLayout(FlowLayout.LEFT,0,0));

//创建底下颜色面板

JPanel back = createBack();

back.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));

//创建左边选择面板

JPanel slecteselectedColor = createSelected();

//创建右边全部颜色面板

JPanel allColor = createAll();

//将左右面板添加到底下面板中去

back.add(slecteselectedColor);

back.add(allColor);

add(back);

}

private JPanel createAll() {

JPanel jp = new JPanel();

//流式布局

jp.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));

//所占用的长和宽

jp.setPreferredSize(new Dimension(210,30));

//定义一个凸起按钮

BevelBorder border1 = new BevelBorder(0,Color.WHITE,Color.GRAY);

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

JButton jbt = new JButton(); //定义按钮组建

jbt.setPreferredSize(new Dimension(15, 15));//定义组建大小

jbt.setBackground(colors[i]); //定义组建颜色

jbt.setBorder(border1); //按钮设置为凸起

//增加监听

jbt.addMouseListener(new ColorActionListener(mainFrame));

jp.add(jbt); //按钮加入到面板中

}

return jp;

}

private JPanel createSelected() {

// TODO Auto-generated method stub

JPanel jp = new JPanel();

//选择区域设置大小

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

//设置背景颜色为白色

jp.setBackground(new Color(128,255,255));

//设置布局为绝对布局,每一个加入到容器的组建必须setBonds()

jp.setLayout(null);

//设置边框

BevelBorder border = new BevelBorder(1,Color.WHITE,Color.GRAY);

jp.setBorder(border);

//增加按钮

BevelBorder border1 = new BevelBorder(0,Color.WHITE,Color.GRAY);

jbt1 = new JButton();

jbt1.setBackground(Color.BLACK);

jbt1.setBounds(5,5,15,15);

jbt1.setEnabled(false);

jbt1.setBorder(border1);

jbt2 = new JButton();

jbt2.setBackground(Color.WHITE);

jbt2.setBounds(10,10,15,15);

jbt2.setEnabled(false);

jbt2.setBorder(border1);

jp.add(jbt1);

jp.add(jbt2);

return jp;

}

public JPanel createBack() {

//创建一个面板

JPanel back  = new JPanel();

//设置大小

back.setPreferredSize(new Dimension(250, 50));

//设置一个空的边框

back.setBorder(new EmptyBorder(10, 0, 10, 10));

return back;

}

 

public void changeSelectedBKColor(Color color) {

jbt1.setBackground(color);

}

public void changeSelectedTCColor(Color color) {

jbt2.setBackground(color);

}

}

DrawBoard :

 

package HUABAN0;

 

import javax.swing.UnsupportedLookAndFeelException;

 

public class DrawBoard {

 

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {

// TODO Auto-generated method stub

MainFrame mf = new MainFrame();

mf.ShowUI();

}

 

}

 

DrawMouseListener :

package HUABAN0;

 

import java.awt.AWTException;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Robot;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.util.Random;

 

public class DrawMouseListener implements MouseListener,MouseMotionListener{

//定义一些需要的

int qbx1=-1,qby1=-1;

int x1,y1,x2,y2;

Graphics graphics;

MainFrame mainFrame;

public DrawMouseListener(Graphics graphics, MainFrame mainFrame) {

this.mainFrame = mainFrame;

this.graphics = graphics;

}

 

@Override

public void mouseDragged(MouseEvent e) {

String cTool = mainFrame.getsTool();

Color bkColor = mainFrame.getBkColor();

int x = e.getX();

int y = e.getY();

switch (cTool) {

case "xp":

// graphics.setColor(Color.WHITE);

// graphics.fillRect(x-5, y-5, 10, 10);

Eraser er = new Eraser(x, y);

DrawPanel.ls.add(er);

mainFrame.repaint();

break;

case "qb":

graphics.setColor(bkColor);

if(qbx1 == -1 && qby1 == -1)

{

//graphics.drawLine(x, y, x, y);

LineShape line = new LineShape(x, y, x, y,bkColor);

DrawPanel.ls.add(line);

}

else

{

//graphics.drawLine(x, y, qbx1, qby1);

LineShape line = new LineShape(x, y, qbx1, qby1,bkColor);

DrawPanel.ls.add(line);

}

mainFrame.repaint();

qbx1 = x;

qby1 = y;

break;

case "pq":

Random r = new Random();

 

int count = 0;

while (count<8) {

int xP = r.nextInt(40)-20;

int yP = r.nextInt(40)-20;

double hypot = Math.hypot(xP, yP);

if(hypot<10)

{

graphics.drawLine(x+xP, y+yP, x+xP, y+yP);

LineShape ss = new LineShape(x+xP, y+yP, x+xP, y+yP,bkColor);

// SprayShape ss = new SprayShape(x+xP, y+yP, x+xP, y+yP,bkColor);

DrawPanel.ls.add(ss);

count++;

}

}

mainFrame.repaint();

break;

default:

break;

}

}

 

@Override

public void mouseMoved(MouseEvent e) {

}

 

@Override

public void mouseClicked(MouseEvent e) {

String cTool = mainFrame.getsTool();

int x = e.getXOnScreen();

int y = e.getYOnScreen();

switch (cTool) {

case "xg":

try {

Robot r = new Robot();

Color pixelColor = r.getPixelColor(x, y);

mainFrame.setBkColor(pixelColor);

mainFrame.colorsPanel.changeSelectedBKColor(pixelColor);

} catch (AWTException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

break;

default:

break;

}

}

 

@Override

public void mouseEntered(MouseEvent e) {

// TODO Auto-generated method stub

}

 

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

 

@Override

public void mousePressed(MouseEvent e) {

String cTool = mainFrame.getsTool();

switch (cTool) {

case "xx":

case "jx":

case "ty":

x1 = e.getX();

y1 = e.getY();

break;

case "qb":

qbx1 = -1;

qby1 = -1;

break;

default:

break;

}

}

 

@Override

public void mouseReleased(MouseEvent e) {

String cTool = mainFrame.getsTool();

Color bkColor = mainFrame.getBkColor();

Color tcColor = mainFrame.getTcColor();

graphics.setColor(bkColor);

switch (cTool) {

case "xx":

x2 = e.getX();

y2 = e.getY();

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

LineShape line = new LineShape(x1, y1, x2, y2,bkColor);

DrawPanel.ls.add(line);

//或者可以写成一下格式

//DrawPanel.ls.add(new LineShape(x1, y1, x2, y2,bkColor));

mainFrame.repaint();

break;

case "jx":

x2 = e.getX();

y2 = e.getY();

// graphics.setColor(bkColor);

// graphics.drawRect(Math.min(x1, x2),Math.min(y1, y2),Math.abs(x1-x2),Math.abs(y1-y2));

// graphics.setColor(tcColor);

// graphics.fillRect(Math.min(x1, x2)+1,Math.min(y1, y2)+1,Math.abs(x1-x2)-1,Math.abs(y1-y2)-1);

// RectShape rs = new RectShape(x1,y1,x2,y2,bkColor,tcColor);

// DrawPanel.ls.add(rs);

DrawPanel.ls.add(new RectShape(x1,y1,x2,y2,bkColor,tcColor));

mainFrame.repaint();

break;

 

case "ty":

x2 = e.getX();

y2 = e.getY();

// graphics.setColor(bkColor);

// graphics.drawOval(Math.min(x1, x2),Math.min(y1, y2),Math.abs(x1-x2),Math.abs(y1-y2));

// graphics.setColor(tcColor);

// graphics.fillOval(Math.min(x1, x2)+1,Math.min(y1, y2)+1,Math.abs(x1-x2)-1,Math.abs(y1-y2)-1);

DrawPanel.ls.add(new OvalShape(x1,y1,x2,y2,bkColor,tcColor));

mainFrame.repaint();

break;

default:

break;

}

}

 

}

 

DrawPanel :

 

package HUABAN0;

 

import java.awt.Color;

import java.awt.Graphics;

 

import javax.swing.JPanel;

import javax.swing.border.LineBorder;

 

 

@SuppressWarnings("serial")

public class DrawPanel extends JPanel{

MainFrame mainFrame;

//定义静态ShapeContainer类型

static ShapeContainer ls = new ShapeContainer();

public DrawPanel(MainFrame mainFrame){

this.mainFrame = mainFrame;

//设置背景颜色

setBackground(Color.WHITE);

//创建颜色,为边框颜色做准备

Color color = new Color(171,171,171);

//创建线条边框

LineBorder lineBorder = new LineBorder(color,4);

//设置边框

setBorder(lineBorder);

}

public void paint(Graphics g){

super.paint(g);

//如果这个静态对象不为空,那么就将其画出来

for (int i = 0;i <ls.getSize(); i++) {

Shape shape = ls.get(i);

shape.draw(g);

}

}

}

 

Eraser :

package HUABAN0;

 

import java.awt.Color;

import java.awt.Graphics;

 

public class Eraser implements Shape{

int x,y;

public Eraser(int x,int y){

this.x = x;

this.y = y;

}

@Override

public void draw(Graphics g) {

g.setColor(Color.WHITE);

g.fillRect(x-5, y-5, 30, 30);

}

}

LineShape :

package HUABAN0;

 

import java.awt.Color;

import java.awt.Graphics;

 

public class LineShape implements Shape{

int x1,x2,y1,y2;

Color bk;

public LineShape(int x1,int y1,int x2,int y2,Color bk){

this.x1 = x1;

this.y1 = y1;

this.x2 = x2;

this.y2 = y2;

this.bk = bk;

}

@Override

public void draw(Graphics g) {

g.setColor(bk);

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

}

}

MainFrame :

package HUABAN0;

 

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Graphics;

 

 

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

 

@SuppressWarnings("serial")

public class MainFrame extends JFrame{

//保存颜色

private Color bkColor = Color.BLACK;

private Color tcColor = Color.WHITE;

//默认工具为铅笔

private String sTool = "qb";

//定义一个颜色面板,工具和绘制面板定义为私有类型

ColorsPanel colorsPanel;

private ToolsPanel toolsPanel;

private DrawPanel drawPanel;

public Color getBkColor() {

return bkColor;

}

public void setBkColor(Color bkColor) {

this.bkColor = bkColor;

}

public Color getTcColor() {

return tcColor;

}

public void setTcColor(Color tcColor) {

this.tcColor = tcColor;

}

public String getsTool() {

return sTool;

}

public void setsTool(String sTool) {

this.sTool = sTool;

}

public ToolsPanel getToolsPanel() {

return toolsPanel;

}

public void setToolsPanel(ToolsPanel toolsPanel) {

this.toolsPanel = toolsPanel;

}  

public void ShowUI(){

//初始化

init();

//创建菜单

creatMenu();

//工具面板

addToolsPanel();

//颜色面板

addColorsPanel();

//绘制面板

addDrawPanel();

//设置可见

setVisible(true);

//监听

addListener();

}

//增加监听

private void addListener() {

// TODO Auto-generated method stub

Graphics graphics = drawPanel.getGraphics();

DrawMouseListener dml = new DrawMouseListener(graphics,this);

// drawPanel.addMouseListener((MouseListener) dml);

// drawPanel.addMouseMotionListener((MouseMotionListener) dml);

drawPanel.addMouseListener(dml);

drawPanel.addMouseMotionListener(dml);

}

 

private void addDrawPanel() {

// TODO Auto-generated method stub

drawPanel = new DrawPanel(this);

add(drawPanel,BorderLayout.CENTER);

}

 

private void addColorsPanel() {

// TODO Auto-generated method stub

colorsPanel = new ColorsPanel(this);

add(colorsPanel,BorderLayout.SOUTH);

}

 

private void addToolsPanel() {

// TODO Auto-generated method stub

toolsPanel = new ToolsPanel(this);

add(toolsPanel,BorderLayout.WEST);

}

 

private void creatMenu() {

// TODO Auto-generated method stub

//增加菜单条

JMenuBar jmb = new JMenuBar();

//增加菜单栏

JMenu jm1 = new JMenu("File");

JMenu jm2 = new JMenu("Edit");

//增加菜单项

JMenuItem ji1 = new JMenuItem("New");

JMenuItem ji2 = new JMenuItem("Open");

//菜单栏加入菜单条

jmb.add(jm1);

jmb.add(jm2);

//菜单项目加入菜单栏

jm1.add(ji1);

jm1.add(ji2);

//菜单条加入到面板

setJMenuBar(jmb);

}

 

public void init() {

// TODO Auto-generated method stub

//设置名称

setTitle("My DrawBorad");

//设置大小

//通过相对路径添加一个ImageIcon对象

ImageIcon ii = new ImageIcon("img/icon.png");

//ImageIcon对象中获取Image,设置上去

setIconImage(ii.getImage());

setSize(500,500);

//设置位置

setLocationRelativeTo(null);

//设置关闭

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

}

OvalShape :

package HUABAN0;

 

import java.awt.Color;

import java.awt.Graphics;

 

public class OvalShape implements Shape{

int x1,x2,y1,y2;

Color bk;

Color tc;

public OvalShape(int x1,int y1,int x2,int y2,Color bk,Color tc){

this.x1 = x1;

this.x2 = x2;

this.y1 = y1;

this.y2 = y2;

this.bk = bk;

this.tc = tc;

}

@Override

public void draw(Graphics g) {

g.setColor(bk);

g.drawOval(Math.min(x1, x2),Math.min(y1, y2),Math.abs(x1-x2),Math.abs(y1-y2));

g.setColor(tc);

g.fillOval(Math.min(x1, x2)+1,Math.min(y1, y2)+1,Math.abs(x1-x2)-1,Math.abs(y1-y2)-1);

}

}

RectShape :

package HUABAN0;

 

import java.awt.Color;

import java.awt.Graphics;

 

public class RectShape implements Shape{

int x1,x2,y1,y2;

Color bk;

Color tc;

public RectShape(int x1,int y1,int x2,int y2,Color bk,Color tc){

this.x1 = x1;

this.x2 = x2;

this.y1 = y1;

this.y2 = y2;

this.bk = bk;

this.tc = tc;

}

@Override

public void draw(Graphics g) {

g.setColor(bk);

g.drawRect(Math.min(x1, x2),Math.min(y1, y2),Math.abs(x1-x2),Math.abs(y1-y2));

g.setColor(tc);

g.fillRect(Math.min(x1, x2)+1,Math.min(y1, y2)+1,Math.abs(x1-x2)-1,Math.abs(y1-y2)-1);

}

}

接口Shape :

package HUABAN0;

 

import java.awt.Graphics;

 

public interface Shape {

public void draw(Graphics g);

}

容器ShapeContainer

package HUABAN0;

 

public class ShapeContainer {

//向容器中添加图形数组

Shape[]all = new Shape[5];

int size = 0;

//往数组中添加元素

public void add(Shape sp){

//判断数组是否越界

if(size == all.length){

//定义一个新的数组,数组长度比原来的多7

Shape[]newall = new Shape[size+7];

//拷贝原数组

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

newall[i] = all[i];

}

//赋值

all = newall;

}

//往数组中添加所选择图形

all[size] = sp;

size++;

}

//从数组中获取图形下标

public Shape get(int index){

if(index < size ){

return all[index];

}

return null;

}

//从数组中移除图形下标

public void remove(int index){

for(int i = index;i<all.length-1;i++){

all[i] = all[i+1];

}

all[size-1] = null;

size--;

}

//获取元素数量的方法

public int getSize(){

return size;

}

}

ToolsActionListener

package HUABAN0;

 

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

 

public class ToolsActionListener implements ActionListener {

MainFrame mainFrame;

public ToolsActionListener(MainFrame mainFrame) {

this.mainFrame = mainFrame;

}

@Override

public void actionPerformed(ActionEvent e) {

System.out.println(e.getActionCommand());

String actionCommand = e.getActionCommand();

mainFrame.setsTool(actionCommand);

}

}

ToolsPanel

package HUABAN0;

 

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Insets;

 

import javax.swing.ButtonGroup;

import javax.swing.ImageIcon;

import javax.swing.JPanel;

import javax.swing.JRadioButton;

import javax.swing.border.BevelBorder;

 

@SuppressWarnings("serial")

public class ToolsPanel extends JPanel{

//工具命令

String[] allCommand = {"wj","xz","xp","pt","xg","fdj","qb","sz","pq","wz","xx","qx","jx","dbx","ty","yjjx"};

//定义主面板

MainFrame mainFrame;

public ToolsPanel(MainFrame mainFrame){

this.mainFrame = mainFrame;

//设置左边边界大小

setPreferredSize(new Dimension(60,0));

//设置背景颜色

setBackground(new Color(240,240,240));

//在中间创建流式布局

setLayout(new FlowLayout(FlowLayout.CENTER,0,0));

//创建一个向上凸起的边框

BevelBorder border = new BevelBorder(BevelBorder.RAISED, new Color(240,240,240),new Color(160,160,160));

setBorder(border);

//创建一个按钮组,使所有按钮能够互斥

ButtonGroup bg = new ButtonGroup();

for(int i=1;i<=16;i++){

//创建四个图标

ImageIcon i1 = new ImageIcon("img/"+i+"-1.png");

ImageIcon i2 = new ImageIcon("img/"+i+"-2.png");

ImageIcon i3 = new ImageIcon("img/"+i+"-3.png");

ImageIcon i4 = new ImageIcon("img/"+i+"-4.png");

//创建单选按钮

JRadioButton jrb = new JRadioButton();

//设置了一个ActionCommand

jrb.setActionCommand(allCommand[i-1]);

if(allCommand[i-1].equals("qb"))

{

jrb.setSelected(true);

}

//设置轻量级组建大小

jrb.setPreferredSize(new Dimension(25,25));

//设置按钮四种状态下标语

jrb.setIcon(i1); //放在一边时

jrb.setRolloverIcon(i2); //移动到上面时

jrb.setPressedIcon(i3); //按压时

jrb.setSelectedIcon(i4); //选择时

jrb.setMargin(new Insets(0, -2, 0, 0));//?????

//给按钮增加监听

jrb.addActionListener(new ToolsActionListener(mainFrame));

add(jrb);

bg.add(jrb);

}

}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值