JAVA SWING 初学

JAVA SWING 初学




一、布局管理器 GridBagLayout




GridBagLayout布局管理器是一个功能十分强大的管理器;它的基本思路是划分单元格
每一个单元格都有各自的属性,而这些属性由GridBagConstrainsts类的成员变量来定义,
且GridBagConstriaints中的所有成员变量都是public的。


jpl.setLayout(new GridBagLayout());     NEW布局管理器
GridBagConstraints c = new GridBagConstraints();  NEW单元格属性类



GridBagConstraints的成员变量:


int gridx    横坐标  当把gridx值设置为GridBagConstriants.RELETIVE时,所添加的组件将被放置在前一个组件的右侧


int gridy    纵坐标  对gridy 值设置为GridBagConstraints.RELETIVE时,所添加的组件将被放置在前一个组件的下方


int gridwidth   横着多长(几个单元格)


int gridheight  高度(几个单元格) 。


double weightx 设置窗口变大时的缩放比例


double weighty 设置窗口变大时的缩放比例


int anchor   设置组件在单元格中的对齐方式(由GridBagConstraints.CENTER等常量表示)


int fill     填充方式,一个组件不能填充单元格时怎么填充


Insets insets    Insets(int top,int left,int bottom,int right)  单元格之间的距离


int ipadx   单元格内的组件的最小尺寸


int ipady
setlayut(NULL)之后,组件要使用SETBOUDS函数才可以正常显示。其他设置位置的函数不会显示。


二、混合布局




JPanel getPanel1(){
jp1 = new JPanel();  
jp1.setLayout(new FlowLayout());  
********
return jp1;
}


JPanel getPanel2(){
jp2 = new JPanel();  
jp2.setLayout(new BorderLayout());  
********
return jp2;
}


//若外层是一个BorderLayout
 this.setLayout(new BorderLayout());   //可以使用GRIDBAG随便混合
 this.add(getPanel1(), BorderLayout.NORTH);  
 this.add(getPanel2(), BorderLayout.SOUTH);  




三、TEXTAREA SCROLL 可换行文本框和滑动键


   
  JTextArea jt=new JTextArea(12,10);  //参数为文本框大小
  JScrollPane scroll = new JScrollPane(jt);//把JT装入可滑动框
  jt.setLineWrap(true);            //自动换行
  scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
  scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //设置滑动键一直出现

  jpl.add(scroll, c); //只用显示滑动框就可以显示文本框,如果你添加了JT的话,显示很有趣的



四、带界面的文件管理系统


package filemaneger;



import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
/*import java.awt.event.ActionEvent;
import java.io.File;*/

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


/*import javax.swing.plaf.basic.BasicButtonListener;*/
/*import javax.swing.JTextArea; */ 

  public class maingui extends  JFrame/* implements ActionListener*/ {
	
	private static final long serialVersionUID = 1L;
	public static String s1;
	public static String s2;
	public static String s3;
	
	
	private JButton
	b1=new JButton("显示文件"),
	b2=new JButton("创建文件夹"),
	b3=new JButton("删除文件(夹)"),
	b4=new JButton("复制文件(夹)"),
	b5=new JButton("文件加密"),
	b6=new JButton("文件解密"),
	b7=new JButton("压缩文件(夹)"),
	b8=new JButton("解压文件"),
	b9=new JButton("原始目录"),
	b10=new JButton("目标目录");
	private gui2 g2=new gui2();
	
	
	
	//文本框
	public static JTextArea jt=new JTextArea(12,10);
	public static JTextField jtf1 = new JTextField();
	public static JTextField jtf2 = new JTextField();
	
	
	class ButtonListener7 implements ActionListener{
		public void actionPerformed(ActionEvent e) {     
	         
	         g2.setVisible(true);
		}
	}
	
	
	public maingui(){
		g2.setVisible(false);
		setTitle("made by Pantheon PY");
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	setSize(500,500);
    	this.getContentPane().add(getPanel());//界面布局函数代码
    	
    
    	
    	
  //监听器
	final ButtonListener1 blis_1=new ButtonListener1();
	b1.addActionListener(blis_1);
	final ButtonListener2 blis_2=new ButtonListener2();
	b2.addActionListener(blis_2);
	final ButtonListener3 blis_3=new ButtonListener3();
	b3.addActionListener(blis_3);
	final ButtonListener4 blis_4=new ButtonListener4();
	b4.addActionListener(blis_4);
	final ButtonListener5 blis_5=new ButtonListener5();
	b5.addActionListener(blis_5);
	final ButtonListener6 blis_6=new ButtonListener6();
	b6.addActionListener(blis_6);
	
	final ButtonListener7 blis_7=new ButtonListener7();
	b7.addActionListener(blis_7);
	final ButtonListener8 blis_8=new ButtonListener8();
	b8.addActionListener(blis_8);
	final yuanlistener blis_9=new yuanlistener();
	b9.addActionListener(blis_9);
	final mdlistener blis_10=new mdlistener();
	b10.addActionListener(blis_10);

	}
	//布局代码
	private JPanel getPanel(){
		JPanel jpl=new JPanel();
		jpl.setLayout(new GridBagLayout());
	    GridBagConstraints c = new GridBagConstraints();  
	    c.fill = GridBagConstraints.BOTH;  
	    c.insets=new Insets(2,2,2,2);
	    c.gridwidth = 1;  
	    c.gridx = 0;  
	    c.gridy = 0;  
	    jpl.add(b1,c);
		c.gridx = 1;  
	    c.gridy = 0;
	    jpl.add(b2, c);
		c.gridx = 2;  
	    c.gridy = 0;
	    jpl.add(b3, c);
		c.gridx = 3;  
	    c.gridy = 0;
	    jpl.add(b4, c);
	    c.gridx = 0;  
	    c.gridy = 1;
	    jpl.add(b5, c);
	    c.gridx = 1;  
	    c.gridy = 1;
	    jpl.add(b6, c);
	    c.gridx = 2;  
	    c.gridy = 1;
	    jpl.add(b7, c); 
	    c.gridx = 3;  
	    c.gridy = 1;
	    jpl.add(b8, c); 
	    
	    
	    c.insets=new Insets(30,2,2,2);
	    c.gridx =0;
	    c.gridy =2;
	    jpl.add(b9, c); 
	    c.gridx =1;
	    c.gridy =2;
	    c.gridwidth=3;
	    jpl.add(jtf1,c);
	    
	    
	    c.insets=new Insets(2,2,2,2);
	    c.gridx =0;
	    c.gridy =3;
	    c.gridwidth=1;
	    jpl.add(b10, c); 
	    c.gridx =1;
	    c.gridy =3;
	    c.gridwidth=3;
	    jpl.add(jtf2,c);
	    c.gridx = 1;  
	    c.gridy = 4;
	    c.gridwidth = 2; 
	    c.gridheight=5;
	    
	    JScrollPane scroll = new JScrollPane(jt); 
    	jt.setLineWrap(true);//自动换行
    	scroll.setHorizontalScrollBarPolicy( 
    			JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    			scroll.setVerticalScrollBarPolicy( 
    			JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //设置滑动键
	    jpl.add(scroll, c); 
	   

		jpl.setBackground(Color.WHITE);
		return jpl;
	}
   //遍历显示文件名代码
	public static void showfile(File file)
	{  
		if(file.isDirectory()){  
            /*System.out.println("文件夹:"+file.getAbsolutePath());*/
        
        	jt.append("文件夹:"+file.getAbsolutePath()+"\n");
        	
        	File[] files = file.listFiles();// 获得传入路径下的所有文件
    		for (int i = 0; i < files.length; i++) {// 
    			{   
    				showfile(new File(files[i].getAbsolutePath()));
    				//jt.append("文件:"+files[i].getAbsolutePath()+"\n");  
    			}
    		}
        
        }  else if(file.isFile()){  
        	
        	jt.append("文件:"+file.getAbsolutePath()+"\n");  
        }
	}
    public static void main(String[] args)
    {
    	maingui frame=new maingui();
    	frame.setVisible(true);
    	
    }
}
package filemaneger;

import java.io.File;

public class CCRDFile {
	// 验证字符串是否为正确路径名的正则表达式
	private static String matches = "[A-Za-z]:\\\\[^:?\"><*]*";
	boolean flag = false;
	File file;
	public   boolean  DeleteFolder(String deletePath) {// 根据路径删除指定的目录或文件,无论存在与否
		flag = false;
		if (deletePath.matches(matches)) {
			file = new File(deletePath);
			if (!file.exists()) {// 判断目录或文件是否存在
				return flag; // 不存在返回 false
			} else {

				if (file.isFile()) {// 判断是否为文件
					return deleteFile(deletePath);// 为文件时调用删除文件方法
				} else {
					return deleteDirectory(deletePath);// 为目录时调用删除目录方法
				}
			}
		} else {
			maingui.jt.append("要传入正确路径!");
			return false;
		}
	}

	public boolean deleteFile(String filePath) {// 删除单个文件
		flag = false;
		file = new File(filePath);
		if (file.isFile() && file.exists()) {// 路径为文件且不为空则进行删除
			maingui.jt.append("文件"+file.getName() + " 删除成功\n");
			file.delete();// 文件删除
			flag = true;
		}
		return flag;
	}

	public boolean deleteDirectory(String dirPath) {// 删除目录(文件夹)以及目录下的文件
		// 如果sPath不以文件分隔符结尾,自动添加文件分隔符
		if (!dirPath.endsWith(File.separator)) {
			dirPath = dirPath + File.separator;
		}
		File dirFile = new File(dirPath);
		// 如果dir对应的文件不存在,或者不是一个目录,则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		flag = true;
		File[] files = dirFile.listFiles();// 获得传入路径下的所有文件
		for (int i = 0; i < files.length; i++) {// 循环遍历删除文件夹下的所有文件(包括子目录)
			if (files[i].isFile()) {// 删除子文件
				flag = deleteFile(files[i].getAbsolutePath());
				maingui.jt.append("文件"+files[i].getAbsolutePath() + " 删除成功\n");
				if (!flag)
					break;// 如果删除失败,则跳出
			} else {// 运用递归,删除子目录
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag)
					break;// 如果删除失败,则跳出
			}
		}
		if (!flag)
			return false;
		if (dirFile.delete()) {// 删除当前目录
			return true;
		} else {
			return false;
		}
	}

	public static void delete(String dir)
	{
		CCRDFile DR=new CCRDFile();
	    DR.DeleteFolder(dir);
	}
}
package filemaneger;

import java.io.File;

public class CCRDFile {
	// 验证字符串是否为正确路径名的正则表达式
	private static String matches = "[A-Za-z]:\\\\[^:?\"><*]*";
	boolean flag = false;
	File file;
	public   boolean  DeleteFolder(String deletePath) {// 根据路径删除指定的目录或文件,无论存在与否
		flag = false;
		if (deletePath.matches(matches)) {
			file = new File(deletePath);
			if (!file.exists()) {// 判断目录或文件是否存在
				return flag; // 不存在返回 false
			} else {

				if (file.isFile()) {// 判断是否为文件
					return deleteFile(deletePath);// 为文件时调用删除文件方法
				} else {
					return deleteDirectory(deletePath);// 为目录时调用删除目录方法
				}
			}
		} else {
			maingui.jt.append("要传入正确路径!");
			return false;
		}
	}

	public boolean deleteFile(String filePath) {// 删除单个文件
		flag = false;
		file = new File(filePath);
		if (file.isFile() && file.exists()) {// 路径为文件且不为空则进行删除
			maingui.jt.append("文件"+file.getName() + " 删除成功\n");
			file.delete();// 文件删除
			flag = true;
		}
		return flag;
	}

	public boolean deleteDirectory(String dirPath) {// 删除目录(文件夹)以及目录下的文件
		// 如果sPath不以文件分隔符结尾,自动添加文件分隔符
		if (!dirPath.endsWith(File.separator)) {
			dirPath = dirPath + File.separator;
		}
		File dirFile = new File(dirPath);
		// 如果dir对应的文件不存在,或者不是一个目录,则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		flag = true;
		File[] files = dirFile.listFiles();// 获得传入路径下的所有文件
		for (int i = 0; i < files.length; i++) {// 循环遍历删除文件夹下的所有文件(包括子目录)
			if (files[i].isFile()) {// 删除子文件
				flag = deleteFile(files[i].getAbsolutePath());
				maingui.jt.append("文件"+files[i].getAbsolutePath() + " 删除成功\n");
				if (!flag)
					break;// 如果删除失败,则跳出
			} else {// 运用递归,删除子目录
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag)
					break;// 如果删除失败,则跳出
			}
		}
		if (!flag)
			return false;
		if (dirFile.delete()) {// 删除当前目录
			return true;
		} else {
			return false;
		}
	}

	public static void delete(String dir)
	{
		CCRDFile DR=new CCRDFile();
	    DR.DeleteFolder(dir);
	}
}
package filemaneger;
import java.io.*;//引入类  
 
public class copyFile {
	
    public static void copyFiles(String oldPath,String newPath){
	try { 
		File a=new File(oldPath); 
		
		if(a.isFile())
		{
			FileInputStream input = new FileInputStream(a); 
			FileOutputStream output = new FileOutputStream(newPath +"\\"+ 
			(a.getName()).toString()); 
			byte[] b = new byte[1024 * 5]; 
			int len; 
			while ( (len = input.read(b)) != -1) { 
			output.write(b, 0, len); 
			} 
			output.flush(); 
			output.close(); 
			input.close(); 
			maingui.jt.append(a.getName().toString()+"复制完成\n");
		}
		else 
		{    
			 newPath=newPath+"\\"+a.getName().toString();
			 File file2=new File(newPath);
			 if(!file2.exists()){  
		            file2.mkdirs();  
		        }  
			 System.out.println(newPath);
		String[] file=a.list(); 
		for (int i = 0; i < file.length; i++) { 
		copyFiles(oldPath+"\\"+file[i],newPath+"\\"); 
		
		} 
		
	}
	}
		catch (Exception e) { 
		maingui.jt.append("复制整个文件夹内容操作出错"); 
		e.printStackTrace(); 

		} 
    }
	public  static  void copy(String str1,String str2){

		copyFiles(str1,str2);
	}

	
}

package filemaneger;

import java.io.*;  
import java.util.zip.*;  
/** 
 * 程序实现了ZIP压缩。共分为2部分 : 
 * 压缩(compression)与解压(decompression) 
 * <p> 
 * 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 
 * 需在代码中自定义源输入路径和目标输出路径。 
 * <p> 
 * 在本段代码中,实现的是解压部分;压缩部分见本包中compression部分。 
 * @author HAN 
 * 
 */  
public class CopyOfMyzipDecompressing {  
      
    public static void dzip(String str,String str2) {  
        // TODO Auto-generated method stub  
        long startTime=System.currentTimeMillis();  
        try {  
            ZipInputStream Zin=new ZipInputStream(new FileInputStream(str));//输入源zip路径  
            BufferedInputStream Bin=new BufferedInputStream(Zin);  
            String Parent=str2; //输出路径(文件夹目录)  
            File Fout=null;  
            ZipEntry entry;  
            try {  
                while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){  
                    Fout=new File(Parent,entry.getName());  
                    if(!Fout.exists()){  
                        (new File(Fout.getParent())).mkdirs();  
                    }  
                    FileOutputStream out=new FileOutputStream(Fout);  
                    BufferedOutputStream Bout=new BufferedOutputStream(out);  
                    int b;  
                    while((b=Bin.read())!=-1){  
                        Bout.write(b);  
                    }  
                    Bout.close();  
                    out.close();  
                    //System.out.println(Fout+"解压成功");      
                    maingui.jt.append(Fout+"解压成功");
                }  
                Bin.close();  
                Zin.close();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        } catch (FileNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        long endTime=System.currentTimeMillis();  
        //System.out.println("耗费时间: "+(endTime-startTime)+" ms");  
        maingui.jt.append("耗费时间: "+(endTime-startTime)+" ms"); 
    }  
  
}  


package filemaneger;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;


import  filemaneger.maingui;

import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.filechooser.FileNameExtensionFilter;


public class jiantingqi {
	public String str;
	
	
	public jiantingqi() {
		str=new String("null");
		
	}
	
}
class ButtonListener1 implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
        JFileChooser jfc=new JFileChooser();  
        File temp=new File("D:\\");
        jfc.setCurrentDirectory(temp);
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );  
       jfc.setDialogTitle("显示(创建)文件和目录");
       int returnVal= jfc.showDialog(new JLabel(), "选择");  
        File file=jfc.getSelectedFile();  
        if(returnVal==JFileChooser.APPROVE_OPTION)
        {
        maingui.jt.setText("");
        maingui.showfile(file);
        }
	}
}
class ButtonListener2 implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
        JFileChooser jfc=new JFileChooser(); 
        File temp=new File("D:\\");
        jfc.setCurrentDirectory(temp);
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );  
        jfc.setDialogTitle("创建文件夹");
        jfc.showDialog(new JLabel(), "确认");  
        maingui.jt.setText("");

	}
}
class ButtonListener3 implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
		
        JFileChooser jfc=new JFileChooser();  
        File temp=new File("D:\\");
        jfc.setCurrentDirectory(temp);
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );  
        jfc.setDialogTitle("删除文件或者文件夹");
        int returnVal= jfc.showDialog(new JLabel(), "确认");
        maingui.jt.setText("");
        if(returnVal==JFileChooser.APPROVE_OPTION)
        {
        File file=jfc.getSelectedFile();  
        CCRDFile.delete(file.toString());
      //  maingui.jt.append("删除成功");
        }

	}
}

class ButtonListener4 implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
        
        maingui.jt.setText("");       
    //    maingui.jt.append("复制文件功能\n");
        maingui.s1=maingui.jtf1.getText();
        maingui.s2=maingui.jtf2.getText();
        copyFile.copy(maingui.s1, maingui.s2);
        maingui.jtf1.setText("");
        maingui.jtf2.setText("");

	}
}
class ButtonListener6 implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
        
        maingui.jt.setText("");       
    //    maingui.jt.append("解密功能\n");
        maingui.s1=maingui.jtf1.getText();
        maingui.s2=maingui.jtf2.getText();
       jiemi.jie(maingui.s1, maingui.s2+"\\解密后文件夹");
       maingui.jtf1.setText("");
       maingui.jtf2.setText("");

	}
}
class ButtonListener5 implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
        
        maingui.jt.setText("");       
     //   maingui.jt.append("加密文件功能\n");
        maingui.s1=maingui.jtf1.getText();
        maingui.s2=maingui.jtf2.getText();
        jiami.jm(maingui.s1, maingui.s2);
        maingui.jtf1.setText("");
        maingui.jtf2.setText("");

	}
}

class ButtonListener8 implements ActionListener{
	public void actionPerformed(ActionEvent e) {  

	//	maingui.jt.append("解压文件功能\n");
		 maingui.s1=maingui.jtf1.getText();
	     maingui.s2=maingui.jtf2.getText();
		CopyOfMyzipDecompressing.dzip(maingui.s1,maingui.s2);
		maingui.jtf1.setText("");
        maingui.jtf2.setText("");
	}
}



class yuanlistener implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
        JFileChooser jfc=new JFileChooser();  
        File temp=new File("D:\\");
        jfc.setCurrentDirectory(temp);
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );  
        jfc.setDialogTitle("选择原目录");
       int re= jfc.showDialog(new JLabel(), "选择");  
        File file=jfc.getSelectedFile();  
        if(re==JFileChooser.APPROVE_OPTION)
        {
        maingui.s1=file.getAbsolutePath();
        maingui.jtf1.setText(maingui.s1);
        }
	}
}

class mdlistener implements ActionListener{
	public void actionPerformed(ActionEvent e) {  
        JFileChooser jfc=new JFileChooser();  
        File temp=new File("D:\\");
        jfc.setCurrentDirectory(temp);
        
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                ".zip","zip");//文件名过滤器
            jfc.setFileFilter(filter);//给文件选择器加入文件过滤器
        
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );  
        jfc.setDialogTitle("选择原目录");
        int re=jfc.showDialog(new JLabel(), "选择");  
        File file=jfc.getSelectedFile();  
        if(re==JFileChooser.APPROVE_OPTION)
        {
        maingui.s2=file.getAbsolutePath();
        maingui.jtf2.setText(maingui.s2);
        }
	}
}
package filemaneger;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class gui2 extends JFrame{
	
	/**
	 * 
	 */
	public String guistr;
	private static final long serialVersionUID = 1L;
	public  JTextField name=new JTextField();
	private JLabel lable=new JLabel("为压缩文件命名");
	private JButton b11=new JButton("确认");
	
	class OKlistener implements ActionListener{
		public void actionPerformed(ActionEvent e) {     
	         maingui.s3=name.getText();
	         maingui.jt.append(maingui.s3);
	         setVisible(false);
	         maingui.s1=maingui.jtf1.getText();
		     maingui.s2=maingui.jtf2.getText();
	         MyZipCompressing.zips(maingui.s1, maingui.s2,maingui.s3);
	         maingui.jtf1.setText("");
	         maingui.jtf2.setText("");
	      
		}
	}
	
	public gui2() {
		// TODO Auto-generated constructor stub
    	setTitle("gui2");
    	setSize(300,200);
    	setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    	
    	setLayout(null);
    	add(b11);
    	b11.setBounds (100, 100,80,40);
    
    	add(name);
    	name.setBounds(40,50,200,30);
    	add(lable);
    	lable.setBounds(40,20,200,30);
    
    	final OKlistener boklis=new OKlistener();
    	b11.addActionListener(boklis);
    
	}
	
	public static void main(String[] args)
	{
		gui2 g2=new gui2();
		g2.setVisible(true);
	}

}

只有部分代码。。。供参考



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值