Swing 入門學習(三)

1-3:版面管理器(Layout Menager)
    
    

   
   
    
     
   
   
   
   
    
    
         |BorderLayout
   
   
         |FlowLayout
   
   
         |GridLayout
   
   
  AWT----|CardLayout
   
   
         |GridBagLayout
   
   

   
   
    
     
   
   
  Swing--|BoxLayout
   
   

  
  
   
    
  
  
 
 
  
  1-3-1
 
 :BorderLayout的使用:
      
      

  
  
   
    
  
  
   BorderLayout的类层次结构图:
   
   
       java.lang.Object
  
  
        --java.awt.BorderLayout
  
  
   构造函数:BorderLayout()建立一个没有间距的border layout
   
   
             BorderLayout(int hgap,int vgap)建立一个组件间有间距的border layout
   
   
  BorderLayout将版面划分为东、西、南、北、中
   
   
 例子:BorderLayoutDemo.java
   
   
import java.awt.*;
  
  
import java.awt.event.*;
  
  
import javax.swing.*;
  
  
public class BorderLayoutDemo{
  
  
   public BorderLayoutDemo(){
  
  
     JFrame f=new JFrame();
  
  
        Container contentPane=f.getContentPane();
  
  
        contentPane.setLayout(new BorderLayout()); 
  
  
        contentPane.add(new JButton("EAST"),BorderLayout.EAST);
  
  
        contentPane.add(new JButton("WEST"),BorderLayout.WEST);
  
  
        contentPane.add(new JButton("SOUTH"),BorderLayout.SOUTH);
  
  
        contentPane.add(new JButton("NORTH"),BorderLayout.NORTH);
  
  
        contentPane.add(new JLabel("CENTER",JLabel.CENTER),BorderLayout.CENTER);
  
  
        f.setTitle("BorderLayout");
  
  
        f.pack();
  
  
        f.setVisible(true);
  
  
        /***read**/
  
  
        /*处理关闭窗口的操作,若你没写这一段,就算你已经关闭窗口了,但程序并不会终止。
   
   
         */
  
  
        f.addWindowListener(
  
  
           new WindowAdapter(){
  
  
               public void windowClosing(WindowEvent e){
  
  
                  System.exit(0);        
  
  
               }    
  
  
           }        
  
  
        );
  
  
       /***read**/
  
  
   }      
  
  
   public static void main(String[] args){
  
  
     BorderLayoutDemo b=new BorderLayoutDemo();    
  
  
   }
  
  
}
  
  
   设置组件的间距,你可以使用有间距参数的BorderLayout构造函数,也可以利用BorderLayoutsetHgap(int hgap)
   
   
   setVgap(int vgap)两个方法来达成。
   
   
 
 
  
  1-3-2
 
 :FlowLayout的使用:
     
     
   FlowLayout的类层次结构图:
   
   
       java.lang.Object
  
  
        --java.awt.FlowLayout
  
  
   构造函数:FlowLayout()建立一个新的Flow Layout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。
   
   
             FlowLayout(int align)建立一个新的Flow Layout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直
   
   
                                 间距。
   
   
             FlowLayout(int align,int hgap,int vgap)建立一个新的Flow Layout,此FlowLayout可设置排列方式与组件间距。
   
   
FlowLayoutDemo.java
  
  
import java.awt.*;
  
  
import java.awt.event.*;
  
  
import javax.swing.*;
  
  
public class FlowLayoutDemo{
  
  
   public FlowLayoutDemo(){
  
  
            JFrame f=new JFrame();
  
  
               Container contentPane=f.getContentPane();
  
  
               /*你可以使用有间距的FlowLayout构造函数,使FlowLayout的排列具有间距,并
   
   
                *并可利用排列方向参数来指定靠什么方向排列,FlowLayout共有五种排列方式,
   
   
                *依次是CENTER(默认值),LEFT,RIGHT,LEADING,TRAILING,若我们将下面程序第13
   
   
                *行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));                                       
   
   
                */
  
  
               contentPane.setLayout(new FlowLayout());           
  
  
               contentPane.add(new JButton("first"));
  
  
               contentPane.add(new JButton("second"));
  
  
               contentPane.add(new JButton("third"));
  
  
               contentPane.add(new JButton("fourth"));
  
  
               contentPane.add(new JButton("fifth"));
  
  
               contentPane.add(new JButton("Last"));
  
  
               
  
  
               f.setTitle("FlowLayout");
  
  
               //f.pack();//必须将f.pach()去掉,否则setSize功能将没有作用
   
   
               f.setSize(400,220);
  
  
               f.setVisible(true);
  
  
        f.addWindowListener(
  
  
           new WindowAdapter(){
  
  
               public void windowClosing(WindowEvent e){
  
  
                  System.exit(0);        
  
  
               }    
  
  
           }        
  
  
        );
  
  
   }
  
  
   public static void main(String[] args){
  
  
     FlowLayoutDemo b=new FlowLayoutDemo();        
  
  
   }
  
  
}
  
  
 
 
  
  1-3-3
 
 :GridLayout的使用:
     
     
       GridLayout的类层次结构图:
   
   
       java.lang.Object
  
  
        --java.awt.GridLayout
  
  
    GridLayoutFlowLayout多了行和列的设置,也就是说你要先设置GridLayout共有几行几列,就如同二维平面一般,然后你加
   
   
进去的组件会先填第一行的格子,然后再从第二行开始填,依此类扒,就像是一个个的格子一般。而且GridLayout会将所填进去组
   
   
件的大小设为一样。
   
   
构造函数:GridLayout()建立一个新的GridLayout,默认值是11列。
   
   
          GridLayout(int rows,int cols)建立一个几行几列的GridLayout.
   
   
          GridLayout(int rows,int cols, int hgap,int vgap)建立一个几行几列的GridLayout,并设置组件的间距。
   
   
例子:CardLayoutDemo.java
   
   

  
  
   
    
  
  
import java.awt.*;
  
  
import java.awt.event.*;
  
  
import javax.swing.*;
  
  
public class CardLayoutDemo implements ActionListener{
  
  
  JPanel p1,p2,p3,p4;
  
  
  int i=1;
  
  
  JFrame f;
  
  
  public CardLayoutDemo(){
  
  
    f=new JFrame();//当做top-level组件
   
   
      Container contentPane=f.getContentPane();
  
  
      contentPane.setLayout(new GridLayout(2,1));
  
  
      
  
  
      p1=new JPanel();
  
  
      Button b=new Button("Change Card");
  
  
      b.addActionListener(this);//当按下"Change Card"时,进行事件监听,将会有系统操作产生。
   
   
      p1.add(b);                //处理操作在52-64.
   
   
      contentPane.add(p1);
  
  
      
  
  
      p2=new JPanel();
  
  
      p2.setLayout(new FlowLayout());
  
  
      p2.add(new JButton("first"));
  
  
      p2.add(new JButton("second"));
  
  
      p2.add(new JButton("third"));
  
  
      
  
  
      p3=new JPanel();
  
  
      p3.setLayout(new GridLayout(3,1));
  
  
      p3.add(new JButton("fourth"));
  
  
      p3.add(new JButton("fifth"));
  
  
      p3.add(new JButton("This is the last button"));
  
  
      
  
  
      p4=new JPanel();
  
  
      p4.setLayout(new CardLayout());
  
  
      p4.add("one",p2);
  
  
      p4.add("two",p3);
  
  
      /*要显示CardLayout的卡片,除了用show(Container parent,String name)这个方法外
   
   
       *,也可试试first(Container),next(Container),previous(Container),last(Container)
   
   
       *四个方法,一样可以达到显示效果。
   
   
       */
  
  
      ((CardLayout)p4.getLayout()).show(p4,"one");
  
  
      
  
  
      contentPane.add(p4);
  
  
      
  
  
      f.setTitle("CardLayout");
  
  
      f.pack();
  
  
      f.setVisible(true);
  
  
      
  
  
      f.addWindowListener(
  
  
           new WindowAdapter(){
  
  
               public void windowClosing(WindowEvent e){
  
  
                  System.exit(0);        
  
  
               }    
  
  
           }        
  
  
      );
  
  
      
  
  
  }
  
  
  public void actionPerformed(ActionEvent event){
  
  
     switch(i){
  
  
        case 1:
  
  
             ((CardLayout)p4.getLayout()).show(p4,"two");
  
  
             break;
  
  
        case 2:
  
  
             ((CardLayout)p4.getLayout()).show(p4,"one");
  
  
             break;
  
  
     }
  
  
     i++;
  
  
     if (i==3) i=1;
  
  
     f.validate();
  
  
  }
  
  
  public static void main(String[] args){
  
  
           new CardLayoutDemo();
  
  
  }
  
  
}
  
  
 
 
  
  1-3-5
 
 :GridBagLayout的使用:
   
   
java中最有弹性但也是最复杂的一种版面管理器。它只有一种构造函数,但必须配合
   
   
                           GridBagConstraints才能达到设置的效果。
   
   
    GridBagLayout的类层次结构图:
   
   
    java.lang.Object
  
  
     --java.awt.GridBagLayout
  
  
构造函数:
   
   
    GirdBagLayout()建立一个新的GridBagLayout管理器。
   
   
    GridBagConstraints()建立一个新的GridBagConstraints对象。
   
   
    GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,
  
  
                       int anchor,int fill, Insets insets,int ipadx,int ipady)建立一个新的GridBagConstraints对象
   
   
                      ,并指定其参数的值。
   
   
 参数说明:
   
   
 gridx,gridy:设置组件的位置,gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。
   
   
             若将gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。建议定义出
   
   
             gridx,gridy的位置,以便以后维护程序。表示放在几行几列,gridx=0,gridy=0时放在00列。
   
   

  
  
   
    
  
  
 gridwidth,gridheight:用来设置组件所占的单位长度与高度,默认值皆为1。你可以使用GridBagConstraints.REMAINDER
   
   
                      量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。
   
   

  
  
   
    
  
  
 weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0
   
   
 anchor:         当组件空间大于组件本身时,要将组件置于何处,有CENTER(默认值)NORTHNORTHEASTEASTSOUTHEAST
   
   
                 WESTNORTHWEST可供选择。
   
   
 insets:设置组件之间彼此的间距,它有四个参数,分别是上,左,下,右,默认为(0,0,0,0).
   
   
 ipadx,ipady:设置组件内的间距,默认值为0              
   
   
   我们以前提过,GridBagLayout里的各种设置都必须通过GridBagConstraints,因此当我们将GridBagConstraints的参数都设置
   
   
好了之后,必须new一个GridBagConstraints的对象出来,以便GridBagLayout使用。
   
   
例子:
   
   
GridBagLayoutDemo.java
  
  

  
  
   
    
  
  
import java.awt.*;
  
  
import java.awt.event.*;
  
  
import javax.swing.*;
  
  
public class GridBagLayoutDemo{
  
  
   public GridBagLayoutDemo(){
  
  
            JButton b;
  
  
            GridBagConstraints c;
  
  
            int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady;
  
  
            double weightx,weighty;
  
  
            Insets inset;
  
  
            
  
  
            JFrame f=new JFrame();
  
  
            
  
  
            GridBagLayout gridbag=new GridBagLayout();
  
  
              Container contentPane=f.getContentPane();
  
  
              contentPane.setLayout(gridbag);
  
  
              
  
  
              b=new JButton("first");
  
  
              gridx=0;
  
  
              gridy=0;
  
  
              gridwidth=1;
  
  
              gridheight=1;
  
  
              weightx=10;
  
  
              weighty=1;
  
  
              anchor=GridBagConstraints.CENTER;
  
  
              fill=GridBagConstraints.HORIZONTAL;
  
  
              inset=new Insets(0,0,0,0);
  
  
              ipadx=0;
  
  
              ipady=0;
  
  
              c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
  
  
                 fill,inset,ipadx,ipady);
  
  
              gridbag.setConstraints(b,c);
  
  
              contentPane.add(b);
  
  
              
  
  
              
  
  
              b=new JButton("second");
  
  
              gridx=1;
  
  
              gridy=0;
  
  
              gridwidth=2;
  
  
              gridheight=1;
  
  
              weightx=1;
  
  
              weighty=1;
  
  
              anchor=GridBagConstraints.CENTER;
  
  
              fill=GridBagConstraints.HORIZONTAL;
  
  
              inset=new Insets(0,0,0,0);
  
  
              ipadx=50;
  
  
              ipady=0;
  
  
              c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
  
  
                 fill,inset,ipadx,ipady);
  
  
              gridbag.setConstraints(b,c);
  
  
              contentPane.add(b);
  
  

  
  
   
    
  
  
              b=new JButton("third");
  
  
              gridx=0;
  
  
              gridy=1;
  
  
              gridwidth=1;
  
  
              gridheight=1;
  
  
              weightx=1;
  
  
              weighty=1;
  
  
              anchor=GridBagConstraints.CENTER;
  
  
              fill=GridBagConstraints.HORIZONTAL;
  
  
              inset=new Insets(0,0,0,0);
  
  
              ipadx=0;
  
  
              ipady=50;
  
  
              c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
  
  
                 fill,inset,ipadx,ipady);
  
  
              gridbag.setConstraints(b,c);
  
  
              contentPane.add(b);
  
  
              
  
  
              b=new JButton("fourth");
  
  
              gridx=1;
  
  
              gridy=1;
  
  
              gridwidth=1;
  
  
              gridheight=1;
  
  
              weightx=1;
  
  
              weighty=1;
  
  
              anchor=GridBagConstraints.CENTER;
  
  
              fill=GridBagConstraints.HORIZONTAL;
  
  
              inset=new Insets(0,0,0,0);
  
  
              ipadx=0;
  
  
              ipady=0;
  
  
              c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
  
  
                 fill,inset,ipadx,ipady);
  
  
              gridbag.setConstraints(b,c);
  
  
              contentPane.add(b);
  
  

  
  
   
    
  
  
              b=new JButton("This is the last button");
  
  
              gridx=2;
  
  
              gridy=1;
  
  
              gridwidth=1;
  
  
              gridheight=2;
  
  
              weightx=1;
  
  
              weighty=1;
  
  
              anchor=GridBagConstraints.CENTER;
  
  
              fill=GridBagConstraints.HORIZONTAL;
  
  
              inset=new Insets(0,0,0,0);
  
  
              ipadx=0;
  
  
              ipady=50;
  
  
              c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,
  
  
                 fill,inset,ipadx,ipady);
  
  
              gridbag.setConstraints(b,c);
  
  
              contentPane.add(b);
  
  

  
  
   
    
  
  
              f.setTitle("GridBagLayout");
  
  
              f.pack();
  
  
              f.setVisible(true);
  
  
      f.addWindowListener(
  
  
           new WindowAdapter(){
  
  
               public void windowClosing(WindowEvent e){
  
  
                  System.exit(0);        
  
  
               }    
  
  
           }        
  
  
      );                
  
  
   }
  
  
   public static void main(String[] args){
  
  
            new GridBagLayoutDemo();
  
  
   }
  
  
}
  
  
 
 
  
  1-3-5
 
 :BoxLayout的使用:
     
     
    BoxLayout的类层次结构图:
   
   
    java.lang.Object
  
  
     --java.awt.BoxLayout
  
  

  
  
   
    
  
  
   BoxLayout提供了两个常数X_AXIS,Y_AXIS来表示水平或垂直排列。若放进去的组件不等高,则系统将会使所有的组件与最高组件
   
   
等高,还有,若你将组件都摆在同一行时,系统不因组件宽度在于Container的宽度,而使组件自动摆在下一行,你必须自行处理换
   
   
行的操作。
   
   
构造函数:
   
   
     BoxLayout(Container targe,int axis)建立一个水平或垂直的BoxLayout.
   
   
   讲到BoxLayout,我们就不得不提到Box这个Container,Box这个Container默认的LayoutBoxLayout,而它只能使用这个Layout,
   
   
否则编译时会有Error产生,如同前面所讲的,BoxLayout是以水平或垂直方式排列,因此,当我们要产生一个Box Container时,
   
   
就必须指定它的排列方式,下面为Box的构造函数:
   
   
  Box(int axis) 建立一个Box Container,并指定组件的排列方式是水平或垂直。
   
   
  上面的axis参数,我们可以使用BoxLayout.X_AXISBoxLayout.Y_AXIS来指定。或是利用Box类所提供的两个方法:
   
   
createHorizontalBox()createVerticalBox(),来建立BoxContainer.
   
   
  Box类提供4种透明的组件来做更方便的版面管理。分别是gluestrutrigidfiller:
   
   
  下面以两个相连的按钮当例子,起始状态如下:
   
   
  B1.java
  
  
1  import java.awt.*;
  
  
2  import java.awt.event.*;
  
  
3  import javax.swing.*;
  
  
4  public class B1{
  
  
5    public B1(){
  
  
6        JFrame f=new JFrame();
  
  
      
  
  
7          Container contentPane=f.getContentPane();
  
  
8          Box baseBox=Box.createHorizontalBox();
  
  
9          contentPane.add(baseBox);
  
  
10         baseBox.add(new JButton("A"));
  
  
11         baseBox.add(new JButton("B"));
  
  
      
  
  
 
 
  
  12         f
 
 .setTitle("BoxLayout");
  
  
 
 
  
  13         f
 
 .setSize(new Dimension(200,50));
  
  
 
 
  
  14         f
 
 .setVisible(true);
  
  
      
  
  
 
 
  
  15         f
 
 .addWindowListener(
  
  
16              new WindowAdapter(){
  
  
17                  public void windowClosing(WindowEvent e){
  
  
18                     System.exit(0);   
  
  
19                  }          
  
  
20              }   
  
  
21         );
  
  
          
  
  
22     }  
  
  
  public static void main(String[] args){
  
  
           B1 b=new B1();
  
  
  }
  
  
}
  
  
Glue:glue插入在两组件间时,它会将两组件挤到最左与最右(或最上与最下),透明的glue将会占满整个中间的空间。
   
   
 例:
   
   
   1011行间加入下面一行程序:
   
   
    baseBox.add(Box.createHorizontalGlue());
  
  
Strut:当你不想将AB按钮挤到最旁边时,你可以使用Strut组件,来设置所需要的大小,但仅能限定一维的大小,例如限定
   
   
     水平或垂直高度。
   
   
  例:在1011行间加入下面一行程序:
   
   
     baseBox.add(Box.createHorizontalStrut(50));//A,B之间间隔50个像素。
   
   
Rigid:这个透明组件跟Strut很像,但它可以设置二维的限制,也就是可以设置水平与垂直的限制宽度。
   
   
  例:在1011行间加入下面一行程序:
   
   
     baseBox.add(Box.createRigidArea(new Dimension(50,50)));
  
  
    为了将Rigid的高度功能显示出来,因此以pack()方法代替setSize()方法,11行替换为:f.pack();
   
   
    若我们将高度再拉长,例如baseBox.add(Box.createRigidArea(new Dimension(50,50)));Dimension改成(50,100),则两
   
   
    组件的上下空白将会增大,因为透明的Rigid组件高度增高了。
   
   
Filler:FillerBoxinner class,它的功能跟Rigid很像,都可以指定长宽的大小限制,且Filler可以指定最大、较佳、最小的长
   
   
      宽大小,以下是Filler的构造函数:
   
   
     Box.Filler(Dimension min,Dimension pref Dimension max)建立一个指定大小的Filler对象。
   
   
     参数min表示最小的显示区域大小,如同上面的例子所示,若所设置最小区域的高度大于按钮AB的高度,则按钮AB的上方
   
   
     与下方将有空白出现。
   
   
   pref表示较佳的显示区域大小。max表示最大的显示区域大小。
   
   
    例:在1011行间加入下面一行程序:
   
   
     baseBox.add(new Box.Filler(new Dimension(50,50),
  
  
                                new Dimension(100,50),
  
  
                                new Dimension(200,50)));
  
  
   Box类所提供的方法:
   
   
   Static Component       createGlue()构造一个Glue组件可向水平与垂直方向延伸
   
   
   Static Box             createHorizontalBox()构造一个水平排列的Box组件
   
   
   Static Component       createHorizontalGlue()构造一个水平的Glue组件
   
   
   Static Component       createHorizontalStrut(int width)构造一个水平的Strut组件
   
   
   Static Component       createRigidArea(Dimension d)构造一个Rigid组件
   
   
   Static Box             createVerticalBox()构造一个垂直排列的Box组件
   
   
   Static Component       createVerticalGlue()构造一个垂直的Glue组件
   
   
   Static Component       createVerticalStrut(int height)构造一个垂直的Strut组件
   
   
   AccessibleContext      getAccessibleContext()取得与JComponent相关边的AccessibleContext
   
   
   Void                   setLayout(LayoutManager l)丢出AWTError,因为Box只能使用BoxLayout
   
   
例子:BoxLayoutDemo.java
   
   
import java.awt.*;
  
  
import java.awt.event.*;
  
  
import javax.swing.*;
  
  
public class BoxLayoutDemo{
  
  
  public BoxLayoutDemo(){
  
  
    JFrame f=new JFrame();
  
  
      
  
  
      Container contentPane=f.getContentPane();
  
  
      Box baseBox=Box.createHorizontalBox();//先产生水平排列方式的Box组件,当作基底容器(BaseBox)
   
   
      contentPane.add(baseBox);
  
  
      
  
  
      /*产生垂直排列方式的Box组件来安置第一与第三个按钮
   
   
       */
  
  
      Box vBox=Box.createVerticalBox();
  
  
      JButton b=new JButton("first");
  
  
      vBox.add(b);
  
  
      b=new JButton("third");
  
  
      b.setMaximumSize(new Dimension(100,150));
  
  
      vBox.add(b);
  
  
      baseBox.add(vBox);
  
  
      
  
  
     /*产生垂直排列方式的Box组件来安置第二与另一个水平排列方式的Box组件
   
   
      */  
  
  
      
  
  
   
   
    
    Box
   
    vBox1
  
  =Box.createVerticalBox();
  
  
      baseBox.add(vBox1);
  
  
      b=new JButton("second");
  
  
      b.setAlignmentX(Component.CENTER_ALIGNMENT);
  
  
      b.setMaximumSize(new Dimension(300,50));
  
  
      vBox1.add(b);
  
  
      
  
  
      Box hBox=Box.createHorizontalBox();
  
  
      vBox1.add(hBox);
  
  
        
  
  

  
  
   
    
  
  
     /*将第四与最后一个按钮加入水平排列方式的Box组件中
   
   
      */
  
  
      
  
  
   
   
    
    Box
   
    vBox2
  
  =Box.createVerticalBox();
  
  
          vBox2.add(Box.createVerticalStrut(50));
  
  
          vBox2.add(new JButton("fourth"));
  
  
          vBox2.add(Box.createVerticalStrut(50));
  
  
          hBox.add(vBox2);
  
  
          
  
  
          
  
  
   
   
    
    Box
   
    vBox3
  
  =Box.createVerticalBox();
  
  
              vBox3.add(Box.createVerticalGlue());
  
  
              vBox3.add(new JButton("THis is the last button"));
  
  
              hBox.add(vBox3);
  
  
            
  
  
      f.setTitle("BoxLayout");
  
  
      f.pack();
  
  
      f.setVisible(true);
  
  
      
  
  
      f.addWindowListener(
  
  
           new WindowAdapter(){
  
  
               public void windowClosing(WindowEvent e){
  
  
                  System.exit(0);        
  
  
               }    
  
  
           }        
  
  
      );
  
  
          
  
  
  }       
  
  
  public static void main(String[] args){
  
  
           BoxLayoutDemo  b=new BoxLayoutDemo();
  
  
  }
  
  
}
  
  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值