Java_Swing程序设计
swing组件允许编程人员在跨平台时指定统一的外观和风格。
Swing组件通常被称为轻量级组件,
JFrame在程序中的语法格式:
JFrame jf=new JFrame(title);
Container container=jf.getContentPane();
jf:JFrame类的对象 container:Container类的对象。
JFrame类的常用构造方法包括以下两种形式:
?public JFrame()? 创建一个初始不可见、没有标题的新窗体
public JFrame(String title) 在实例化该Frame对象时可以创建一个不可见但具有标题的窗体。
setVisible(true) 方法使窗体可见
setDefaultCloseOperation()方法关闭窗体。
DO_NOTHING_ON_CLOSE 什么都不做就将窗体关闭
DISPOSE_ON_CLOSE 代表任何注册监听程序对象后会自动隐藏并释放窗体
HIDE_ON_CLOSE 隐藏窗口的默认关闭
EXIT_ON_CLOSE 退出应用程序默认窗口关闭
JDialog窗体
JDialog窗体是Swing组件中的对话框,它继承了AWT组件中的Java.awt.Dialog类。
其功能是从一个窗体中弹出另一个窗体,在使用时也使用调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。
public JDialog() 创建一个没有标题和父窗体的对话框。
public JDialog(Frame f) : 创建一个指定父窗体的对话框,但该窗体没有标题。
public JDialog(Frame f, boolean model): 创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题。
public JDialog(Frame f,boolean model): 创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题。
public JDialog(Frame f,String title,boolean model):创建一个指定标题、窗体和模式的对话框。
JFrame类中的两种构造方法分别为无参的构造方法和有参的构造方法。
第一种形式的构造方法可以创建一个初始不可见、没有标题的新窗体,第二种形式的构造方法在实例化该JFrame对象时可以创建一个不可见但具有标题的窗体。
package Procedures;
import javax.swing.*;
import java.awt.*;
public class Example1 extends JFrame{
public void CreateJFrame(String title){
JFrame jf=new JFrame(title); //实例化一个JFrame对象
Container container= jf.getContentPane(); //获取一个容器
JLabel jl=new JLabel("这是一个JFrame窗体"); //创建一个JLable标签
jl.setHorizontalAlignment(SwingConstants.CENTER); //使标签上的文字居中
container.add(jl); //将标签添加到容器中
container.setBackground(Color.white); //设置容器的背景颜色
jf.setVisible(true); //使窗体可视
jf.setSize(200,150); //设置窗体大小
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置窗体关闭方式
}
public static void main(String args[]){ //在主方法中调用CreateJFrame()方法
new Example1().CreateJFrame("创建一个JFrame窗体");
}
}
setSize(int x,int y)方法设置窗体大小,其中x,y代表窗体的宽与高。
创建窗体后,给予窗体一个关闭方式,可以调用setDefaultCloseOperation()方法。Java常用窗体关闭方法有以下4种。
DO_NOTHING_ON_CLOSE? 代表什么都不做就将窗体关闭
DISPOSE_ON_CLOSE? 任何注册监听程序对象后会自动隐藏并释放窗体
HIDE_ON_CLOSE? EXIT_ON_CLOSE 隐藏窗口的默认窗口关闭
EXIT_ON_CLOSE 退出应用程序默认窗口关闭
JDialog窗体
JDialog窗体是Swing组件中的对话框,他继承了AWT组件中的java.awt.Dialog类
JDialog窗体的功能是从一个窗体中弹出另一个窗体,它与JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。
public JDialog(): 创建一个没有标题和父窗体的对话框。
public JDialog(Frame f):创建一个指定父窗体的对话框,但该窗体没有标题。
public JDialog(Frame f,boolean model):创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题。
public JDialog(Frame f,String title):创建一个指定标题和父窗体的对话框。
public JDialog(Frame f,String title,boolean model):创建一个指定标题、窗体和模式的对话框)
标签组件与图标
在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。在应用程序的用户界面中,一个简短的文本标签可以使用户知道这些组件的目的,所以标签在Swing中是比较常用的组件。
标签的使用
标签由JLable类定义,它的父类为JComponent类。
标签可以显示一行只读文本、一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单的显示文本和图片,但是可以使用标签的特性指定标签上文本的对其方式。
JLabel类提供了多种构造方法,可以创建多种标签,如显示只有文本的标签、只有图标的标签或包含文本与图标的标签。JLabel类常用的几个构造方法如下。
public JLabel(): 创建一个不带图标和文本的JLabel对象。
public JLabel(Icon icon): 创建一个带图标的JLabel对象。
public JLabel(Icon icon,int aligment): 创建一个带图标的JLabel对象,并设置图标水平对齐方式。
public JLabel(String text,int aligment): 创建一个带文本的JLabel对象,并设置文字水平对齐方式。
public JLabel(String text,Icon icon,int aligment): 创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式。
图标的使用
Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。
创建图表
在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。如果使用Icon接口,必须实现Icon接口中的3个方法:
public int? getIconHeight()
public int getIconWidth()
public void paintIcon(Component arg0,Graphics arg1,int arg2,int arg3)
getIconHeigth()与getIconWidth()方法用于获取图标的长与宽,paintIcon()方法用于实现在指定坐标位置画图。
public ImageIcon(): 该构造方法构建一个通用的ImageIcon对象,当真正需要设置图片时再使用ImageIcon对象调用setImage(Image image)方法;来操作。
public ImageIcon(Image image,String description): 除了可以从图片源创建图标之外,还可以为这个图标添加简短的描述,但这个描述不会在图标上显示,可以使用getDescripion()这个方法获取这个描述。
public ImageIcon(URL url):该构造方法利用位于计算机网络上的图像创建图标
常用布局管理器:
布局管理器提供了Swing组件安排、展示在容器中的方法及基本的布局功能。
Swing提供的常用布局管理器包括流布局管理器、边界布局管理器和网格布局管理器。
绝对布局:
在Swing中,除了使用布局管理器外还可以使用绝对布局。绝对布局,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。
使用绝对布局的步骤如下:
1.使用Container.setLayout(null)方法取消布局管理器。
2.使用Component.setBounds()方法设置每一个组件的大小与位置。
流布局管理器
流布局管理器是最基本的布局管理器,在整个容器中的布局正如其名,像流水一样从左到右摆放组件,直到占据这一行的所有空间。然后再向下移动一行,组件默认居中排列。
FlowLayout类中具有以下常用的构造方法:
public FlowLayout()
public FlowLayout(int alignment)
public FlowLayout(int aligment,int horizGap,int vertGrap)
alignment参数表示流布局管理器后组件在每一行的具体摆放位置。
FlowLayout.LEFT=0? ?行组件左对齐排列
FlowLayout.CENTER=1;?
FlowLayout.RIGHT=2; 行组件被指定为右对齐排列
horizFGap与vertGap两个参数分别以像素为单位指定组件之间的水平间隔与垂直间隔。
边界布局管理器
在默认不指定窗体布局的情况下,Swing组件的布局模式是边界布局管理器。
边界布局管理器的功能不止如此,边界布局管理器还可以将容器划分为东、南、西、北、中5个区域,可以将组件加入到者5个区域中。
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class BorderLayoutPosition extends JFrame {
//定义组件摆放位置的数组
String[] border= {BorderLayout.CENTER,BorderLayout.NORTH,
BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.EAST};
String[] buttonName= {"center button","north button","south button","west button","east button"};
public BorderLayoutPosition() {
setTitle("这个窗体使用边界布局管理器");
Container c=getContentPane(); //定义一个容器
setLayout(new BorderLayout()); //设置容器为容器为边界布局管理器
for(int i=0;i<border.length;i++) {
//在容器中添加按钮,设置按钮布局
c.add(border[i],new JButton(buttonName[i]));
}
setSize(350,200); //设置窗体大小
setVisible(true); //设置窗体可见
//设置窗体关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
new BorderLayoutPosition();
}
}
add()方法提供在容器中添加组件的功能,并同时设置组建的摆放位置。
网格布局管理器
网络布局管理器将容器划分为网格,所以组件可以按行和列进行排列。
在网格布局管理器中,每一个组件的大小都相同,并且网格中空格的个数由网格的行数和列数决定。
组件从网格的左上角开始,按照从左到右、从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件的大小也会改变。
网格布局管理器主要有以下两个常用的构造方法:
public GridLayout(int rows,int columns)
public GridLayout(int rows,int columns,int horizGap,int vertGap)
rows与columns参数代表网格的行数与列数,这两个参数只有一个参数可以为0,代表一行或一列可以排列任意多个组件;参数horizGap与vertGap指定网格之间的距离,其中horizGap参数指定网格之间的水平距离,vertGap参数指定网络之间的垂直距离。
网格组布局管理器
由GridBagLayout类实现的布局管理器称为网格组布局管理器,
它实现了一个动态的矩形网格,可以根据实际需要随意增减矩形网格的行数和列数。
向GridBagLyout类管理的容器中添加组件时,需要为每个组件创建一个与之关联的GridBagConstants类的对象,通过该类的属性可以设置组件的布局信息。?
通过GridBagLayout类实现的矩形网格的绘制方向由容器决定。?如果容器的方向是从左到右,则位于矩形网格左上角的单元格的列索引为0,此时组件左上角的点为起始点;如果容器的方向是从右到左,则位于矩形网格右上角的单元格的列索引为0,此时组件右上角的点为起始点。
详细讲解GridBagLayout类中各个属性的功能和使用方法,以及在使用过程中需要注意的一些事项。
1.grid和gridy属性
这两个属性用来设置组件起始点所在单元格的索引值。需要注意的是,属性gridx设置的是x轴,所以它表示的是组件起始点所在列的索引;属性gridy设置的是Y轴的索引值,所以它表示的是组件起始点所在行的索引。? ? ?
? ? ?
gridwidth和gridheight属性
这两个属性用来设置组件占用网格组的行数和列数。属性gridwidth为组件占用网格组的列数,也可以理解为以单元格为单位组件的宽度:属性gridheight为组件占用网格组的行数,也可以理解为以单元格为单位组件的高度。
anchor属性
属性anchor用来设置组件在其所在显示区域的显示位置。通常将显示区域从方向上划分为9个方位。
fill属性
属性fill用来设置组件的填充方式。当单元格显示区域的面积大于组件面积,或者开一个组件占用多个单元格时,显示组件可能不必占用所有显示区域,在这种情况下可以通过fill属性设置组件的填充方式。可以利用4个静态常量设置该属性,默认情况下是将该属性设置为静态常量NONE,既不调整组件大小至填满显示区域;如果该属性设置为静态常量HORIZONTAL,表示只调整组件水平方向的大小(组件宽度)至填满显示区域;如果将该属性设置为静态常量VERTICAL,表示只调整组件垂直方向的大小(组件高度)至填满显示区域;如果将该属性设置为静态常量BOTH,则表示同时调整组件的宽度和高度至填满显示区域。
? ? ? ? ?inserts属性
属性insets用来设置组件四周与单元格边缘之间的最小距离。该属性的类型为Insets.Insets类仅有一个构造方法Insets(int top,int left,int bottom,int right),它的4个入口参数以此为组件上方、左侧、下方和右侧的最小距离,单位为像素。? ?
? ? ? ? ?ipadx和ipady属性
这两个属性用来修改组件的首选大小,属性ipadx用来修改组建的宽度,属性ipady用来修改组件的高度,如果为正数,则在首选大小的基础上增加指定的宽度和高度,如果为负数,则在首选大小的基础上减小指定的宽度和高度。?
weightx和weighty属性
这两个属性用来设置网格组的每一行和每一列对额外空间的分布方式。在不设置属性weightx和weighty的情况下,当窗体调整到足够大时,组件全部聚集在窗体的中央,在组件四周出现了大片的额外空间,为了避免,可以通过这两个属性设置网格组的每行每列对额外空间的分布方式。如果在该行中设置了多个weighty属性,则取它们的最大值为该行的分布方式。
在设置网格组的每一行和每一列对额外空间的分布方式时,建议只设置第一行的weightx属性和第一列的weighty属性,这样会方便前期调试和后期维护。
网格组的行和列对额外空间的分布方式完全相同,下面以网格组的行为为例详细讲解对额外空间的分布方式。网格组布局管理器首先计算出每一行的分布方式,即获取每一行的weighty属性的最大值,然后计算每个最大值占所有最大值总和的百分比,最后将额外空间的相应百分比分配给对应行。
在设置网格组的每一行和每一列对额外空间的分布方式时,建议为各个属性按百分比取值。
常用面板
面板也是一个Swing容器,它可以作为容器容纳其他组件,但它也必须被添加到其他容器中。Swing中常用的面板包括JPanel面板以及JScrollPane面板。
JPanel面板
JPanel面板可以聚集一些组件来布局。面板也是一种容器,因为它继承自java.awt.Container类。
JScrollPane面板
在设置面板时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容的情况,这时可以使用JScrllPane面板。此面板是带滚动条的面板,它也是一种容器,但是只能放置一个组件,并且不可以使用布局管理器。如果需要在JScrollPane面板中放置多个组件,需要将多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane组件上。
按钮组件
按钮在Swing组件中是较为常见的组件,用于触发特定动作。Swing中提供多种按钮,包括提交按钮、复选框、单选按钮等,这些按钮都是从AbstarctButon类中继承而来的。
提交按钮组件
Swing中的提交按钮(JButton)由JButton对象表示,其构造方法主要有以下几种方式:
public JButton()? //可以生成不带任何文本组件的对象和图标,能在以后使用相应方法为按钮设置指定的文本和图标
public JButton(String text)?
public JButton(Icon icon)
public JButton(String text,Icon icon)
通过使用上述构造方法,在Swing按钮上不仅能显示文本标签,还可以显示图标。
单选按钮组件
单选按钮(JRadioButton)显示一个圆形图标,并且在该图标旁放置一些说明性文字,而在应用程序中,一般将多个单选按钮放置在按钮组中,使这些单选按钮表现出某种功能,当用户选中某个单选按钮后,按钮中其他按钮将被自动取消。控制按钮的诸多方法都是从AbstractButton类中的方法
1.单选按钮
可以使用JRadioButton类中的构造方法创建单选按钮对象。常用构造方法如下:
public JRadioButton().。
public JRadioButton(Icon icon)。
public JRadioButton(Icon icon,boolean selected)。
public JRadioButton(String text)。
public JRadioButton(String text,Icon icon)。
public JRadioButton(String text,Icon icon,boolean selected)。
在初始化单选按钮时,可以同时设置单选按钮的图标、文字以及默认是否被选中等属性。
按钮组
在Swing中存在一个ButtonGroup类,用于产生按钮组,如果希望将所有的单选按钮放置在按钮组中,需要实例化一个JRadioButton对象,并使用该对象调用add()方法添加单选按钮。
JRadioButton jr1=new JRadioButton();
JRadioButton jr2=new JRadioButton();
JRadioBUtton jr3=new JRadioButton();
ButtonGroup group=new ButtonGroup();
group.add(jr1);
group.add(jr2);
group.add(jr2);
group.add(jr3);
复选框组件
复选框在Swing组件中的使用也非常广泛,它具有一个方块图标,外加一段描述性文字。与单选按钮唯一不同的是,复选框可以进行多选设置,每一个复选框都提供选中与不选中两种状态。
复选框用JCheckBox类对象表示
JcheckBox的常用构造方法如下:
public JCheckBox()
public JCheckBox(Icon icon,boolean checked)
public JCheckBox(String text,boolean checked)
列表组件
Swing中提供两种列表组件,分别为下拉列表框与列表框。下拉列表框与列表框都是带有一系列的项目的组件,用户可以从中选择需要的项目。列表框较下拉列表框更直观,他将所有的项目罗列在列表框中;但下拉列表框较列表框更为便捷、美观,他将所有的项目隐藏起来,当用户选用其中的项目时才显现出来。
下拉列表框组件
JComboBox类
Swing中的下拉列表框不仅可以供用户从中选择项目,也提供编辑项目中内容的功能。
下拉列表框是一个带条状的显示区,它具有下拉功能。在下拉列表框的右方存在一个倒三角形的按钮,当用户单击该按钮时,下拉列表框中的项目将会以列表形式显示出来。
Swing中的下拉列表框使用JComboBox类对象来表示,它是javax.swing.JComponent类的子类。它的常用构造方法如下:
public JComboBox()
public JComboBox(ComboBoxModeldataModel)
public JComboBox(Object[] arrayData)
public JComboBox(Vector vector)
在初始化下拉列表框时,可以选择同时下拉列表框中的项目内容,也可以在程序中使用其他方法设置下拉列表框中的内容。
JComboBox模型
在开发程序中,一般将下拉列表框中的项目封装为ComboBoxModel的情况比较多。ComboBoxModel为接口,它代表一般模型,可以自定义一个类实现该接口,然后再初始化JComboBoxModel接口类型,但是必须实现以下两种方法:
public void setSelectedItem(Object item)
public ObjectgetSelectedItem()
其中setSelectedItem()方法用于设置下拉列标框中的选中项,getSelectedItem()方法用于返回下拉列表框中的选中项。
getSize():返回列表的长度
getElementAt(int index):返回指定索引处的值
列表框组件
列表框与下拉列表框的区别不仅表现在外观上,当激活下拉列表框时,还会出现下拉列表框中的内容,;但列表框只是在窗体上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放入滚动面板中。
Swing中使用JList类对象来表示列表框,下面列举几个常用的构造方法。
public void JList()
public void JList(Object[] listData)
public void JList(Vector listData)
public void JList(ListModel dataModel)
存在一个没有此参数的构造方法,可以通过在初始化列表框后使用setListData()方法对列表框进行设置。设置的方式由3种类型,包括数组、Vector类型和ListModel没模型。
当使用数组作为构造方法的参数时,首先需要创建列表项目的数组,然后再利用构造方法来初始化列表框。
使用数组作为初始化列表框的参数
String contents={"列表1“,"列表2“,"列表3”,"列表4“};
JList jl=new JList(contents);
使用Vector类型数据作为初始化列表框的参数
Vector contents=new Vector();
JList jl=new JList(contents);
JList jl=new JList(contents);
contents.add("列表1”);
contents.add("列表2");
使用ListModel模型为参数,需要创建ListModel对象。ListModel是Swing包中的一个接口它提供了获取列表框属性的方法。通常情况下,为了使用户不完全实现ListModel接口中的方法,通常先自定义一个类继承实现该接口的抽象类AbstractListModel。在这个类中提供了getElementAt()与getSize()方法,其中getElementAt()方法代表根据项目的索引获取列表框中的值,而getSize()方法用于获取列表框中的项目个数。
public class JListTest extends JFrame {
public JListTest() {
Container cp=getContentPane();
cp.setLayout(null);
JList<String> jl=new JList<>(new MyListModel()); //JDK7新特性
JScrollPane js=new JScrollPane(jl);
js.setBounds(10,10,100,100);
cp.add(js);
setTitle("在这个窗体中使用了列表框");
setSize(200,150);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
JListTest a=new JListTest();
}
}
class MyListModel extends AbstractListModel<String>{
private static final long serialVersionUID=1L;
private String[] contents= {"列表1","列表2","列表3","列表4","列表5","列表6"};
public String getElementAt(int x) {
if(x<contents.length) {
return contents[x];
}
else
return null;
}
public int getSize() {
return contents.length;
}
}
? ? ? ?使用DefaultListModel类创建列表框,该类扩展了AbstractListModel类,也可以通过DefaultListModel对象向上转型为ListModel接口初始化列表框,同时DefaultListMoel类提供了addElement()方法实现将内容添加到列表框中。
使用DefaultListModel类创建列表框
final String[] flavors={"列表1","列表2","列表3","列表4","列表5","列表6"};
fianl DefaultListModel iItems=new DefaultListModel();
final JList Ist=new JList(Items); //实例化JList对象
for(int i=0;i<4;i++){
iltems.addElement(flavors[i]); //为模型增加内容
}
? ? ? ? ?文本组件
文本组件在实际项目中使用最为广泛,尤其是文本框与密码框组件。通过文本组件可以很轻松的处理单行文字、多行文字、口令字段。
文本框组件
文本框用来显示或编辑一个单行文本,在Swing中通过java.swing.JTextField类对象创建,该类继承了javax.swing.text.JTextComponent类,下面列举了一些创建文本框常用的构造方法。
public JTextField()
public JTextField(String text)
public JTextField(int fieldeidth)
public JTextField(String text,int fieldwidth)
public JTextField(Document docModel,String text,int fieldWidth)
通过在初始化文本框时设置文本框的默认文字、文本框的长度。
密码框组件
? 密码框与文本框的定义与用法基本相同,唯一不同的是密码框将用户输入的字符串以某种符号进行加密,密码框对象是通过javax.swing.JPasswordField类来创建的,JPasswordField类的构造方法与JTextField类的构造方法非常相似。
public JPasswordField()
public JPasswordField(String text)
public JPasswordField(int fieldwidth)
public JPasswordField(String text,int fieldwidth)
public JPasswordField(Document docModel,String text,int fieldWidth)
? 在程序中定义密码框JPasswordField jp=new JPasswordField(); jp.setEchoChar('#'); //设置回显字符
? 文本域组件
Swing中任何一个文本区域都是JTextArea类型的对象。JTextArea常用的构造方法如下:
public JTextArea()
public JTexArea(String text)
public JTextArea(int rows,int columns)
public JTextArea(Document doc)
public JTextArea(Document doc,String Text,int rows,int columns)
上述构造方法可以在初始化文本域时提供默认文本以及文本域的长与宽? ? ?
JTextArea类中存在一个setLineWrap()方法,该方法用于设置文本域是否可以自动换行。如果将该方法的参数设置为true,文本域将自动换行,否则不自动换行。
常用事件监听器
监听事件简介
在Swing事件模型中由3个分离的对象完成对事件的处理,分别为事件源、事件以及监听程序。事件源触发一个事件,它被一个或多个“监听器"接收,监听器负责处理事件。
所谓事件监听器,实质上就是一个”实现特定类型监听器接口"的类对象。事件几乎都以对象来表示,它是某种事件类的对象,事件源(如按钮)会在用户做出相应的动作(如按钮被按下)时产生事件对象,如动作事件对应ActionEvent类对象,同时要编写一个监听器的类必须实现相应的接口,如ActionEvent类对应的是ActionListener接口,需要获取某个事件对象必须实现相应的接口,同时需要将接口中的方法一一实现。最后事件源(按钮)调用相应的方法加载这个"实现特定类型监听器接口"的类对象,所有的事件源都可以为组件添加或移除相应的事件监听器。
动作事件监听器
动作事件监听器是Swing中比较常用的事件监听器,很多组件的动作都会使用它监听,如按钮被单击。? ?
? ? ?
一般情况下,为事件源做监听事件应使用匿名类形式。
焦点事件监听器
焦点事件监听器在实际项目开发中应用也比较广泛,如将光标焦点离开一个文本框时需要弹出一个对话框,或将焦点返回给该文本框等。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!