ImageVerifierCode 换一换
格式:DOC , 页数:29 ,大小:522.50KB ,
资源ID:11398273      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/11398273.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(JavaSwing的复杂控件.doc)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

JavaSwing的复杂控件.doc

1、9.1 JTextArea (文本区) JTextArea 是一个显示纯文本的多行区域,它具有换行功能,同时能也可以借助JScrollPane提供垂直和水平滚动的功能。 9.1.1 JTextArea的构造函数 JTextArea() 构造新的 TextArea JTextArea(Document doc) 构造新的 JTextArea,使其具有给定的文档模型,所有其他参数均默认为 (null, 0, 0) JTextArea(int rows,int columns) 构造具有指定行数和列数的新的空 TextArea 9.1.2 JTextArea的常用方法 appen

2、d(String str) 将给定文本追加到文档结尾 String getText() 返回JTextArea中的内容 int getLineCount() 返回 JTextArea 中当前文本所占的行数 setLineWrap(boolean wrap) 设置文本区的换行策略 9.1.3文本区与文本域 下面示例展示了文本区与文本域的文本显示特点,文本域只能输入和显示单行文本,且不能提供换行与滚动条功能,而文本区则既可以提供通过换行的多行显示,也能通过将文本区添加到一个JScrollPane(滚动窗格)中实现垂直和水平的滚动功能。 示例1 package edu.l

3、earn; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class JTextAreaExample extends JFrame implements ActionListener{ JLabel userLab = new JLabel("发信人:",JLabel.LEFT); JTextField userText = new JTextField(20); JLabel mailLab = new JLabel("所发信息:",JLabel.LEFT);

4、 JTextField mailText = new JTextField(20); JLabel infoLabe = new JLabel("信息记录:",JLabel.LEFT); JTextArea txtArea = new JTextArea(5,20); public JTextAreaExample() { init(); setTitle("文本域练习"); setBounds(200,200,250,270); setResizable(false); setVisible(true); setDefaultClos

5、eOperation(JFrame.EXIT_ON_CLOSE); } public void init() { setLayout(new FlowLayout(FlowLayout.LEFT)); add(userLab); add(userText); add(mailLab); add(mailText); add(infoLabe); //JTextArea不能自己提供滚动条,它必须借助于滚动窗格JScrollPane JScrollPane scroll = new JScrollPane(txtArea

6、); txtArea.setEditable(false); add(scroll); mailText.addActionListener(this); } public void actionPerformed(ActionEvent e) { txtArea.append(userText.getText() + ": " + mailText.getText()+ "\n"); mailText.setText(""); } public static void main(String[] args) { new

7、JTextAreaExample(); } } 运行结果: 9.1.4 文本区上的DocumentEvent事件 JTextArea经常触发的事件是DocumentEvent事件,DocumentEvent类放在javax.swing.envent包中。当文本区中的文本进行编辑操作,使文本区中的文本内容发生变化时,就会导致文本区中的文档模型中的数据发生变化,从而导致文本区触发DocumentEvent事件。DocumentEvent事件实现的接口以及接口中的抽象事件处理方法如下: 事件类型 对应监听器接口 接口中的抽象事件方法 DocumentEvent D

8、ocumentListener public void changeUpdate(DocumentEvent e) ; public void removeUpdate(DocumentEvent e) ; public void insertUpdate(DocumentEvent e) ; 以下示例展示了文本区的DocumentEvent(文档事件)的处理方法,该示例中有两个文本区,当用户朝一个文本区中输入文本时,就触发DocumentEvent事件中的文档内容改变事件,从而把修改的内容添加到另一个文本区中。 示例2 package edu.learn; import j

9、ava.awt.*; import java.awt.event.*; import javax.swing.event.*; import javax.swing.*; import java.util.*; public class WindowTextSort extends JFrame implements DocumentListener { JTextArea text1,text2; WindowTextSort() { init(); setLayout(new FlowLayout()); setBou

10、nds(120,100,300,240); setResizable(false); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } void init() { text1=new JTextArea(5,25); text2=new JTextArea(5,25); add(new JScrollPane(text1)); add(new JScrollPane(text2));

11、 text1.setLineWrap(true); text2.setLineWrap(true); text2.setEditable(false); (text1.getDocument()).addDocumentListener(this);//向文档注册监视器 } public void changedUpdate(DocumentEvent e) { //接口方法 String str=text1.getText(); String s = str.substring(str.lengt

12、h()-1); text2.append(s); } public void removeUpdate(DocumentEvent e) { //接口方法 changedUpdate(e); } public void insertUpdate(DocumentEvent e) { //接口方法 changedUpdate(e); } public static void main(String args[]){ WindowTextSort win=new WindowTextSort

13、); win.setTitle("窗口"); } } 运行结果: 9.2 JCheckBox(复选框) JCheckBox复选框是一个拥有被选定状态和取消选定状态的对象,用户可以通过点击复选框对象来切换其状态 9.2.1 JCheckBox的构造函数 JCheckBox() 创建一个没有文本、没有图标并且最初未被选定的复选框 JCheckBox(String name) 创建一个带文本的、最初未被选定的复选框 JCheckBox(Icon icon) 创建有一个图标、最初未被选定的复选框 JCheckBox(String name,Ico

14、n icon) 创建带有指定文本和图标的、最初未选定的复选框 9.2.2 JCheckBox的常用方法 setIcon(Icon icon) 设置当前复选框的图标 setText(String name) 设置当前复选框的文本 String getText() 获得当前复选框的文本 boolean isSeleced() 获得当前复选框的是否被选中的状态,如果被选中则返回true,否则返回false 9.2.3 JCheckBox的ItemEvent事件 当JCheckBox(复选框)的选中状态由于用户的鼠标点击而出现改变时,复选框就会触发ItemEvent事件。其中

15、ItemEvent 对应的监听器接口和抽象方法如下: 事件类型 对应监听器接口 接口中的抽象事件方法 ItemEvent ItemListener public void ItemStateChanged(ItemEvent e); JCheckBox注册ItemEvent事件监听器对象的方法如下: addItemListener(ItemListener listener) 注册ItemEvent事件监听器对象 removeItemListener(ItemListener listener) 移除ItemEvent事件监听器对象 以下是一个通过多个复选框

16、选择购买电脑附件的示例,每当用户选中或者是取消复选框状态时就触发ItemEvent事件,在该事件中将被选中的复选框中的内容获取后显示在下面的文本框中。 示例3 package edu.learn; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class JCheckBoxExample extends JFrame implements ActionListener{ JCheckBox cb1 = new JCheckBox("无限鼠标"); JCheckBox

17、cb2 = new JCheckBox("移动硬盘"); JCheckBox cb3 = new JCheckBox("U盘"); JCheckBox cb4 = new JCheckBox("打印机"); JPanel p1 = new JPanel(); JLabel label = new JLabel("需要购买的附件:"); public JCheckBoxExample() { setTitle("复选框练习"); p1.setLayout(new GridLayout(4,1)); p1.setBorder(BorderFactor

18、y.createTitledBorder("系统退出时")); p1.add(cb1); p1.add(cb2); p1.add(cb3); p1.add(cb4); add(p1,BorderLayout.CENTER); add(label,BorderLayout.SOUTH); cb1.addActionListener(this); cb2.addActionListener(this); cb3.addActionListener(this); cb4.addActionListener(this); this.se

19、tBounds(200, 200, 300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public void actionPerformed(ActionEvent e) { String s = ""; if(cb1.isSelected() == true) s += " " + cb1.getText(); if(cb2.isSelected() == true) s += " " + cb2.getText(); i

20、f(cb3.isSelected() == true) s += " " + cb3.getText(); if(cb4.isSelected() == true) s += " " + cb4.getText(); label.setText("需要购买的附件:"+s); } public static void main(String args[]) { JCheckBoxExample.setDefaultLookAndFeelDecorated(true); JCheckBoxExample frame = new JCheckBoxE

21、xample(); } } 运行结果: 9.3 JRadioButton (单选按钮) JRadioButton(单选按钮)与JCheckBox(复选框)类似,都拥有被选中和未被选中两种状态,用户通过鼠标点击在这两个状态中进行切换。所不同的是复选框组中每个对象状态的改变都不影响其它复选框对象的状态,而在同一组中的单选按钮则同一时间只有一个单选按钮对象能处于被选中状态。因此单选按钮在使用时必须拥有一个“按钮组”的控件来将若干个单选按钮归入同一个组中,例如: ButtonGroup group = new ButtonGroup(); JRadioButto

22、n radIBM = new JRadioButton("IBM"); JRadioButton radToshiba = new JRadioButton("TOSHIBA"); JRadioButton radLennvo = new JRadioButton("lenovo"); JRadioButton radAcer = new JRadioButton("acer"); group.add(radIBM); group.add(radToshiba); group.add(radLennvo); group.add(radAcer); 9.3.1 J

23、RadioButton的构造函数 JRadioButton() 创建一个初始化为未选择的单选按钮,其文本未设定 JRadioButton(Icon icon) 创建一个初始化为未选择的单选按钮,其具有指定的图像但无文本 JRadioButton(Icon icon, boolean selected) 创建一个具有指定图像和选择状态的单选按钮,但无文本 JRadioButton(String text) 创建一个具有指定文本的状态为未选择的单选按钮 JRadioButton(String text, boolean selected) 创建一个具有指定文本和选择状态的单选按

24、钮 JRadioButton(String text, Icon icon) 创建一个具有指定的文本和图像并初始化为未选择的单选按钮 JRadioButton(String text, Icon icon, boolean selected) 创建一个具有指定的文本、图像和选择状态的单选按钮 9.2.2 JRadioButton的常用方法 setIcon(Icon icon) 设置单选按钮的图标 setText(String name) 设置单选按钮的文本 String getText() 获得单选按钮的文本 boolean isSeleced() 获得单选按钮的是否

25、被选中的状态,如果被选中则返回true,否则返回false 9.3.3 JRadioButton的ItemEvent和ActionEvent事件 JRadioButton与JCheckBox相同,当用户改变它们的状态时,触发的也同样是ItemEvent事件,不过也可以使用ActionEvent事件来完成用户对于单选按钮的操作事件处理。 示例4 package edu.learn; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class JRadioButtonEx

26、ample extends JFrame implements ActionListener{ ButtonGroup group = new ButtonGroup(); JRadioButton radIBM = new JRadioButton("IBM"); JRadioButton radToshiba = new JRadioButton("TOSHIBA"); JRadioButton radLennvo = new JRadioButton("lenovo"); JRadioButton radAcer = new JRadioButton("acer"

27、); JLabel label = new JLabel("我选择的电脑是:"); public JRadioButtonExample() { setTitle("JRadioButton example"); this.setLayout(new GridLayout(5,1)); add(radIBM); add(radToshiba); add(radLennvo); add(radAcer); add(label); radIBM.addActionListener(this); radTosh

28、iba.addActionListener(this); radLennvo.addActionListener(this); radAcer.addActionListener(this); group.add(radIBM); group.add(radToshiba); group.add(radLennvo); group.add(radAcer); radIBM.setSelected(true); this.setBounds(200, 200, 300, 200); this.setDefaul

29、tCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public void actionPerformed(ActionEvent e) { String s = ((JRadioButton)e.getSource()).getText(); label.setText("我选择的电脑是:" + s); } public static void main(String[] args) { JRadioButtonExample.setDefaultLookAnd

30、FeelDecorated(true); JRadioButtonExample frame = new JRadioButtonExample(); } } 运行结果: 9.4 JComboBox (组合框) JComboBox (组合框)也叫作下拉列表,叫它组合框是因为它更像是由文本框和列表框组合形成的一个控件,用户可以通过文本框旁的一个箭头按钮将选项列表打开,选中内容后关闭选项列表,并将信息显示在文本框中。 9.4.1 JComboBox的构造函数 JComboBox() 创建具有默认数据模型的 JComboBox JComboBox(Objec

31、t[] items) 创建包含指定数组中的元素的 JComboBox 9.4.2 JComboBox的常用方法 addItem(Object anObject) 为项列表添加项 Object getItemAt(int index) 返回指定索引处的列表项 int getItemCount() 返回列表中的项数 int getSelectedIndex() 返回组合框中当前被选中选项的索引,索引的起始值为0 Object getSelectedItem() 返回组合框中当前被选中选项的对象 removeItem(Object anObject) 从项列表中移除项

32、removeItemAt(int anIndex) 移除 anIndex 处的项 removeAllItems() 从项列表中移除所有项 9.4.3 JCheckBox的ItemEvent和ActionListener事件 当用户使用鼠标点击组合框时,组合框会触发ActionListener事件,而当用户从一个选中一个选项,同时取消前一个被选中选项时则会触发ItemEvent事件。 9.5 JList(列表框) 多组数据项可以在列表框中进行同时显示,并且允许用户选择一个或多个项。 9.5.1 JList的构造函数 JList() 构造一个具有空的、只读模型的 JLis

33、t JList(Object[] listData) 构造一个 JList,使其显示指定数组中的元素 JList(ListModel dataModel)) 根据指定的非 null 模型构造一个显示元素的 JList 使用JList(Object[] listData)创建的列表框,列表框中的项是静态的,不可修改的。因为JList控件只提供数据项的显示和提取操作,而不提供数据的添加和修改。如果需要动态的设置数据项给列表框,就必须使用模型。这很类似与MVC结构,即JList提供数据的显示和用户的交互,而ListModel(模型)则负责数据的存储和修改。具体如下: 经常用于JL

34、ist中进行存储数据的模型为DefaultListModel,它用于存储可变数据,具体用法如下: ListModel JList 显示 交互 数据存储和修改 DefaultListModel lstModel = new DefaultListModel(); JList listType = new JList(lstModel); 9.5.2 JList的常用方法 Object getSelectedValue() 返回最小的选择单元索引的值;只选择了列表中单个项时,返回所选值。 int getSelectedIndex() 返回最小的选择单元索引

35、只选择了列表中单个项时,返回该选择。 ListModel getModel() 返回保存由 JList 组件显示的项列表的数据模型 setSelectedIndex(int index) 选择单个单元 setSelectedValue(Object anObject, boolean shouldScroll) 从列表中选择指定的对象 9.5.3 ListModel的常用方法 add(int index, Object element) 在指定index处添加一个列表项 addElement(Object element) 在列表末尾追加一个element列表项

36、Object getItemAt(int index) 返回指定索引处的列表项 int getSize() 返回列表的长度 remove(int index) 移除指定index位置的列表项 removeElement(Object obj) 移除列表中的对应obj的列表项 removeElementAt(int index) 移除指定index位置的列表项 removeAllElements() 移除列表中的所有项 9.5.4 JList的ListSelectionEvent事件 当用户选择列表中的选项使列表选择值发生更改时,就会触发ListSelectioEvn

37、et事件。ListSelectioEvnet属于javax.swing.event包中,其监听器接口和抽象事件方法如下: 事件类型 对应监听器接口 接口中的抽象事件方法 ListSelectioEvnet ListSelectionListener public void valueChanged(ListSelectionEvent e) JList注册ListSelectioEvnet事件监听器对象的方法如下: addListSelectionListener(ListSelectioEvnet listener) 注册ItemEvent事件监听器对象 remo

38、veListSelectionListener(ListSelectioEvnet listener) 移除ItemEvent事件监听器对象 以下示例展示的是一个购买电脑的过程案例,窗体中首先使用组合框实现品牌的选择,之后根据品牌在列表框中实现该品牌各种型号的设置。最后用户选择型号后,该电脑品牌和型号都将显示在窗体下部的文本框中。 示例5 package edu.learn; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.*; import javax.

39、swing.*; import javax.swing.event.*; import java.awt.*; public class JComboBoxAndJListExample2 extends JFrame implements ItemListener,ListSelectionListener{ JComboBox compute = new JComboBox();//定义组合框 DefaultListModel lstModel = new DefaultListModel(); //定义一个用于存储可变数据的模型 JList listType = new

40、 JList(lstModel); //利用模型创建列表框 JScrollPane scroll = new JScrollPane(listType); //使用滚动面板提供滚动条功能 JTextField text = new JTextField("您所选择的电脑:"); Object type[][] = {{"E40","E220","x120e","x201i","x1","L412","L420","T420i","T410i"}, {"C600-C01B","L600-62R","L700-T10R","C600D-T10B","L700-C07R",

41、"L750-T01S"}, {"Y470N-IFI","Y470N-ISE","G460AL-ITH(A)","Y460C-ITH(灰)","G470AH-ITH(深棕色)","Y470N-ITH"}}; public JComboBoxAndJListExample2() { setTitle("组合框与列表框"); compute.addItem("IBM"); compute.addItem("TOSHIBA"); compute.addItem("lenovo"); compute.addItemListener(this);

42、 setLayout(new BorderLayout(5,5)); add(compute,BorderLayout.NORTH); add(scroll,BorderLayout.CENTER); listType.setFixedCellWidth(150); //设置列表框的每个单元的宽度 listType.addListSelectionListener(this); add(text,BorderLayout.SOUTH); JList list = new JList(); //设置窗体

43、的大小和位置 this.setBounds(200, 200, 400, 220); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } //对应ItemListener的事件方法 public void itemStateChanged(ItemEvent e) { String s = (String)compute.getSelectedItem(); //e.getStateChange() == e.SELECTED用于避

44、免两次的事件触发 if (s.equals("IBM")&& e.getStateChange() == e.SELECTED) { lstModel.removeAllElements(); for(int i=0;i

45、veAllElements(); for(int i=0;i

46、]); } } } //对应ListSelectionListener的事件方法 public void valueChanged(ListSelectionEvent e) { if(e.getValueIsAdjusting() == true) //用于避免两次的事件触发 { String brand = compute.getSelectedItem().toString(); String type = listType.getSelectedValue().toString(); text.setText("您

47、所选择的电脑:" + brand + " " + type); } } public static void main(String[] args) { //利用默认的窗口管理器为窗体实现新的外观 JComboBoxAndJListExample2.setDefaultLookAndFeelDecorated(true); JComboBoxAndJListExample2 frame = new JComboBoxAndJListExample2(); } } 运行结果: 9.6 容器 容器分为底层容器和中间容器

48、底层容器有JFrame,JDialog,它们拥有标题栏、菜单栏,是所有控件以及中间容器赖以放置的基本容器。而中间容器是必须被添加到底层容器才能发挥作用的容器。它们没有标题栏、没有菜单栏,虽然也能作为容器添加组件,但却不能独立存在。 9.6.1 JPanel面板 面板是一个用于放置一个或多个组件的中间容器,拥有默认的布局(FlowLayout流式布局)。 JPanel p = new JPanel(); p.add(componet1); p.add(componet2); 9.6.2 JScrollPanl 滚动窗格 滚动窗格只可以添加一个组件,且该组件拥有多行或者多

49、列的数据显示要求。大多数情况下这样的组件有JTextArea、JList、JTree、JTable等等。 JscrollPane scroll = new JScrollPane(new JTextArea()); 9.6.3 JSplitPane拆分窗格 拆分窗格顾名思义就是把窗体拆分为两个部分,每个部分可以是一个容器。拆分窗格有两种两种类型:水平拆分和垂直拆分。 1. 水平拆分 splitPane = new JSplitPane(JSplitPane. HORIZONTAL_SPLIT,true); splitPane.setDividerLocation(0.5)

50、 splitPane.add(p1,JSplitPane.LEFT); splitPane.add(p2,JSplitPane.RIGHT); 2. 垂直拆分 splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); splitPane.setDividerLocation(0.5); splitPane.add(p1,JSplitPane.TOP); splitPane.add(p2,JSplitPane.BOTTOM); 示例6 package edu.learn; import javax.s

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服