Java的GUI编程.ppt

上传人:qwe****56 文档编号:70013314 上传时间:2023-01-14 格式:PPT 页数:51 大小:2.56MB
返回 下载 相关 举报
Java的GUI编程.ppt_第1页
第1页 / 共51页
Java的GUI编程.ppt_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《Java的GUI编程.ppt》由会员分享,可在线阅读,更多相关《Java的GUI编程.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、湘恒教育JAVA基础培训一月一月 23 23JavaJava的的GUIGUI编程程目标了解GUI编程和AWT包及其组件理解Swing和AWT的区别理解Java常用布局管理器运用简单swing组件编写Java图形化应用程序JAVA基础培训JavaJava的的GUIGUI编程程本章理解词汇JAVA基础培训JavaJava的的GUIGUI编程程单 词说 明component组件组件container容器容器Jframe框架、窗口框架、窗口Jpanel面板面板Layout布局布局flowlayout流式布局流式布局BorderLayout边框布局边框布局GridLayout网格布局网格布局East东东

2、 West西西 South南南 North北北 脑图JAVA基础培训JavaJava的的GUIGUI编程程GUIGUI编程程AWTAWT与与SwingSwing如何如何创建建图形界面形界面布局管理器布局管理器什么是GUI编程JAVA基础培训JavaJava的的GUIGUI编程程vgraphical user interfaces-图形用户界面v为用户提供界面友好的所见所得的桌面操作环境。JComboBoxJCheckBoxJButtonJRadioButtonJLabelJTexAreaJTexFieldjava.awt包java.awt包是Java内置的包,属于Java基本类库(JFC)的一

3、部分,其中包括以下内容:便于用户输入的一组丰富的界面组件;将组件放置在适当位置的几中布局管理器;事件处理模型;图形和图像工具等等。要使用到该包中的类,则必须显式地声明如下语句:import java.awt.*;JAVA基础培训JavaJava的的GUIGUI编程程java.awt包中控件类的体系结构JAVA基础培训JavaJava的的GUIGUI编程程ComponentButtonCheckboxContainerChoiceCanvasTextComponentLabelPanelAppletFrameDialogWindowTextAreaTextFieldSwing简介和javax.s

4、wing包Swing是在AWT基础上发展而来的轻量级组件,与AWT相比不但改进了用户界面,而且所需的系统资源更少;Swing是纯Java组件,使所有的应用程序在不同的平台上运行时具有本机外观和相同的行为。javax.swing包包含了一系列Swing控件,如果要使用该包中的类,则必须显式地声明如下语句:import javax.swing.*;JAVA基础培训JavaJava的的GUIGUI编程程javax.swing包中控件类的体系结构JAVA基础培训JavaJava的的GUIGUI编程程JFrameFrameJDialogDialogWindowJComponentContainerCom

5、ponentObjectJOptionPaneJMenuBarJListJLabelJComboBoxJTextJPanelJScrollBarAbstractButtonJMenuItemJButtonJToggleButtonJMenuJRadioButtonJCheckBoxJTextFieldJTextArea组件类与容器类v组件组件(Component):(Component):基本图形元素,如按钮,文本框,文本基本图形元素,如按钮,文本框,文本域,多选按钮,单选按钮等域,多选按钮,单选按钮等v容器容器(Container):(Container):可以容纳组件的区域,在容器上可以添

6、可以容纳组件的区域,在容器上可以添加别的组件。如:加别的组件。如:Frame,WindowFrame,Window等。等。v注意:容器中可以容纳组件,也可以容纳比它注意:容器中可以容纳组件,也可以容纳比它“容量级别容量级别小小”的容器。的容器。JAVA基础培训JavaJava的的GUIGUI编程程AWT容器JAVA基础培训JavaJava的的GUIGUI编程程vWindowWindow的子类的子类vFrame:Frame:最常用的窗体最常用的窗体vDialog:Dialog:对话框对话框有两种类型的容器:有两种类型的容器:WindowWindow和和PanelPanelvWindowWindo

7、w的与的与PanelPanel的区别:的区别:vWindowWindow是能够独立存放的容器;是能够独立存放的容器;vPanelPanel不能单独存在,必须放入不能单独存在,必须放入 WindowWindow或其子类中或其子类中Swing GUI框架JAVA基础培训JavaJava的的GUIGUI编程程菜单栏菜单栏顶级容器顶级容器GUIGUI组件组件GUIGUI组件组件内容窗格内容窗格顶级容器JFrame:用于框架窗口的类,此窗口带有边框、标题、用于关闭和最小化窗口的图标等。带 GUI 的应用程序通常至少使用一个框架窗口。JDialog:用于对话框的类。JApplet:用于使用 Swing 组

8、件的 Java Applet 的类。JAVA基础培训JavaJava的的GUIGUI编程程中间容器JPanel:最灵活、最常用的中间容器。JScrollPane:与 JPanel 类似,但还可在大的组件或可扩展组件周围提供滚动条。JTabbedPane:包含多个组件,但一次只显示一个组件。用户可在组件之间方便地切换。JToolBar:按行或列排列一组组件(通常是按钮)。JAVA基础培训JavaJava的的GUIGUI编程程javax.swing.JFrameJFrame组件用于在Swing程序中创建窗体;以下是JFrame常见的构造方法:JAVA基础培训JavaJava的的GUIGUI编程程构

9、造方法说 明JFrame()创建一个框架,该框架初始为不可见JFrame(String title)创建一个框架,参数title为窗体标题,该框架初始为不可见JFrame的常用方法JAVA基础培训JavaJava的的GUIGUI编程程函数原型说 明void setTitle(String title)以title中指定的值,设置窗体的标题void setSize(int w,int h)设置窗体的大小,参数w和h指定宽度和高度void show()显示窗体Container getContentPane()获得窗体的内容面板,当要往窗体中添加组件或设置布局时,要使用到该方法void setVi

10、sible(boolean b)设置窗体是否为可见,由参数b决定void setBackground(Color c)设置窗体的背景色创建窗体示例JAVA基础培训JavaJava的的GUIGUI编程程import javax.swing.*;public class SwingDemo extends JFrame /*构造方法构造方法*/public SwingDemo()this.setTitle(“我的第一个我的第一个GUI程序程序”);/设置窗体的标题设置窗体的标题 this.setSize(300,200);/设置窗体的大小设置窗体的大小 this.setVisiblesetVisi

11、ble(true);/将窗体显示将窗体显示 this.setDefaultCloseOperation.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);(JFrame.EXIT_ON_CLOSE);/*main方法,程序入口方法,程序入口*/public static void main(String args)/创建窗体的实例,匿名对象创建窗体的实例,匿名对象 new SwingDemo();JPanel容器vJPanelJPanel是最简单的容器类。应用程序可以将其他组件放在是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内。面板提

12、供的空间内。vJPanelJPanel只能只能存在于其他的容器存在于其他的容器(Window(Window或其子类或其子类)中,一般中,一般被放入被放入FrameFrame中中vJFrameJFrame可以被划分为若干个可以被划分为若干个JPanelJPanel,然后在,然后在JPanelJPanel上进一上进一步进行组件的布局;步进行组件的布局;v面板的默认布局管理器是面板的默认布局管理器是FlowLayoutFlowLayout布局管理器;布局管理器;v不能为不能为JPanelJPanel设置标题。设置标题。JAVA基础培训JavaJava的的GUIGUI编程程Javax.swing.JP

13、anel的常用方法JAVA基础培训JavaJava的的GUIGUI编程程函数原型说 明JPanel()创建默认布局(FlowLayout)的面板JPanel(LayoutManager layout)以指定的布局管理器创建面板void setLayout(LayoutManager layout)以指定布局管理器设置面板的布局Component add(Component comp)往面板内添加控件Void setBackground(Color bg)设置面板的背景色布局管理器v布局管理器用来:布局管理器用来:v决定组件在容器上如何摆放;决定组件在容器上如何摆放;v决定组件的大小;决定组件的

14、大小;vFrameFrame的默认布局管理器是的默认布局管理器是BorderLayout;BorderLayout;vJAVAJAVA中常用的布局:中常用的布局:vFlowLayoutFlowLayout(流式布局)(流式布局)vBorderLayoutBorderLayout(边框布局)(边框布局)vGridLayoutGridLayout(网格布局)(网格布局)GridBagLayoutGridBagLayout(网格包布局)(网格包布局)CardLayout CardLayout(卡片布局)(卡片布局)JAVA基础培训JavaJava的的GUIGUI编程程为容器设置布局v布局管理器布局管

15、理器(LayoutManager)(LayoutManager)指的是指的是FlowLayout,BorderLayFlowLayout,BorderLayoutout等类的对象;等类的对象;v调用容器对象的调用容器对象的setLayout(LayoutManager setLayout(LayoutManager lm)lm)方法,即可为容器设置不同的布局;方法,即可为容器设置不同的布局;v利用多种复杂布局的组合,总可以达到你想要的效果。利用多种复杂布局的组合,总可以达到你想要的效果。JAVA基础培训JavaJava的的GUIGUI编程程FlowLayoutJAVA基础培训JavaJava的

16、的GUIGUI编程程容器容器容器容器流布局是面板的默认布局管理器左上角右下角依次排序的组件垂直或水平间距BorderLayout JAVA基础培训JavaJava的的GUIGUI编程程上边的组件 左边的组件右边的组件下边的组件容器容器容器容器NorthNorthSouthSouthEastEastWestWestCENTERCENTERGridLayout JAVA基础培训JavaJava的的GUIGUI编程程行行列列组件大小相同重新调整组件大小以适合各自的单元指定网格中的行数和列数,创建网格布局CardLayout可存储几个不同的布局。可存储几个不同的布局。每个布局就像是一个卡片组中的一张卡

17、片。每个布局就像是一个卡片组中的一张卡片。在一个给定的时间总会有一张卡片在顶层。在一个给定的时间总会有一张卡片在顶层。卡片通常为一个卡片通常为一个 Panel 对象。对象。每当需要许多面板切换,而每个面板需要显示为不同每当需要许多面板切换,而每个面板需要显示为不同布局时,可以使用卡片布局。布局时,可以使用卡片布局。JAVA基础培训JavaJava的的GUIGUI编程程GridBagLayout 通过使用以下语法容器可获得通过使用以下语法容器可获得 GridBagLayout:GridBagLayout gb=new GridBagLayout();ContainerName.setLayout

18、(gb);要使用此布局,必须提供各组件的大小和布局等信息。要使用此布局,必须提供各组件的大小和布局等信息。GridBagConstraints 类中包含类中包含 GridBagLayout 类用来定位及调整组件大小所需的全部信息。类用来定位及调整组件大小所需的全部信息。JAVA基础培训JavaJava的的GUIGUI编程程v组件大小不必相同组件大小不必相同v组件按行和列排列组件按行和列排列v放置顺序不一定为从放置顺序不一定为从左至右和由上至下左至右和由上至下GridBagConstraints 类成员变量列表:成员变量列表:-gridx,gridy:指定组件放置于哪个单元中指定组件放置于哪个单

19、元中-gridwidth,gridheight:指定组件将占用多少行和多少列指定组件将占用多少行和多少列-weightx,weighty:指定在一个指定在一个 GridBagLayout 中应如何分配空间中应如何分配空间,这些变量的缺省值为这些变量的缺省值为 0-ipadx,ipady:指定组件的高度和宽度指定组件的高度和宽度JAVA基础培训JavaJava的的GUIGUI编程程GridBagConstraints成员变量列表:成员变量列表:-fill:指定在单元大于组件的情况下指定在单元大于组件的情况下,组件如何填组件如何填充此单元充此单元,共有共有4可选值。缺省值为:可选值。缺省值为:Gr

20、idBagConstraints.NONE-anchor:指定将组件放置在单元中的位置,共有指定将组件放置在单元中的位置,共有9个个可选值。缺省值为:可选值。缺省值为:GridBagConstraints.CENTER JAVA基础培训JavaJava的的GUIGUI编程程Swing 组件Swing 组件独立于本地窗口系统。Swing组件除了 AbstractButton 类之外都以 J 开头。Swing 组件是基于 AWT 构建。包含 AWT 可视化组件的替代组件,也包含复杂组件-树和表JAVA基础培训JavaJava的的GUIGUI编程程JLabel JAVA基础培训JavaJava的的G

21、UIGUI编程程它既可以显示文本也可以显示图像构造函数如下:JLabel(Icon icon)JLabel(Icon icon):iconicon表示使用的图标表示使用的图标JLabel(String text,Icon icon,int align)JLabel(String text,Icon icon,int align):texttext表示使用的字表示使用的字符串符串;icon;icon表示使用的图标表示使用的图标;align;align表示水平对齐方式,其值可以表示水平对齐方式,其值可以为:为:LEFTLEFT、RIGHTRIGHT、CENTERCENTER。ImageIcon i

22、con=new ImageIcon(Calv.gif);JLabel calv_label=new JLabel(这这是是 Calvin,icon,SwingConstants.LEFT);文本组件 JtextComponent 为所有 Swing 文本组件的根类JAVA基础培训JavaJava的的GUIGUI编程程JTextField JEditorPaneJTextAreaJTextPaneJPasswordFieldJTextFieldJTextField 组件允许输入或编辑单行文本此类的构造函数包括:JTextField()JTextField()JTextField(Document

23、 doc,String text,int columns)JTextField(Document doc,String text,int columns)JTextField(int columns)JTextField(int columns)JTextField(String text)JTextField(String text)JTextField(String text,int columnJTextField(String text,int columnJAVA基础培训JavaJava的的GUIGUI编程程Container con=getContentPane();con.set

24、Layout(new FlowLayout();JLabel jl=new JLabel(“文本域文本域”);con.add(jl);JTextField tf=new JTextField(20);con.add(tf);JTextAreaJTextArea 组件用于接受来自用户的多行文本它可实现可滚动界面JTextArea 组件可使用下列构造函数创建:JTextArea()JTextArea()JTextArea(int rows,int cols)JTextArea(int rows,int cols)JTextArea(String text)JTextArea(String text

25、)JTextArea(String text,int rows,int cols)JTextArea(String text,int rows,int cols)JTextArea(Document doc)JTextArea(Document doc)JTextArea(Document doc,String text,int rows,int cols)JTextArea(Document doc,String text,int rows,int cols)JAVA基础培训JavaJava的的GUIGUI编程程JLabel jl=new JLabel(“文本区文本区”);con.add(j

26、l);JTextArea ta=new JTextArea(5,10);con.add(ta);选择性输入为了简化表单填写过程,通常为用户提供多种可供选择的选项,而无需用户写出他们的响应。常用于选择性输入的组件有:复选框复选框单选按钮单选按钮列表框列表框组合框组合框JAVA基础培训JavaJava的的GUIGUI编程程复选框复选框用于为用户提供一组选项JCheckBox 类具有下列构造函数:JCheckBox()JCheckBox()JCheckBox(Icon icon)JCheckBox(Icon icon)JCheckBox(Icon icon,boolean selected)JChe

27、ckBox(Icon icon,boolean selected)JCheckBox(String text)JCheckBox(String text)JCheckBox(String text,boolean selected)JCheckBox(String text,boolean selected)JCheckBox(String text,Icon icon)JCheckBox(String text,Icon icon)JCheckBox(String text,Icon icon,boolean selected)JCheckBox(String text,Icon icon,

28、boolean selected)JAVA基础培训JavaJava的的GUIGUI编程程单选按钮单选按钮允许用户从多个选项中选择其中一个ButtonGroup 用于在 Swing 中创建组JRadioButton 对象可使用下列构造函数创建:-JRadioButton()JRadioButton()-JRadioButton(Icon icon)JRadioButton(Icon icon)-JRadioButton(Icon,boolean selected)JRadioButton(Icon,boolean selected)-JRadioButton(String text)JRadio

29、Button(String text)-JRadioButton(String text,boolean selected)JRadioButton(String text,boolean selected)-JRadioButton(String text,Icon icon)JRadioButton(String text,Icon icon)-JRadioButton(String text,Icon icon,boolean JRadioButton(String text,Icon icon,boolean selected)selected)JAVA基础培训JavaJava的的GU

30、IGUI编程程JCheckBox和JRadioButton使用示例JAVA基础培训JavaJava的的GUIGUI编程程import java.awt.*;import javax.swing.*;class Hobby extends JPanel JCheckBox c1=new JCheckBox(阅读,false);JCheckBox c2=new JCheckBox(音乐,false);JCheckBox c3=new JCheckBox(绘画,false);JRadioButton rad1=new JRadioButton(大专);JRadioButton rad2=new JR

31、adioButton(本科);JRadioButton rad3=new JRadioButton(硕士);JLabel jl=new JLabel(您有什么爱好?);JLabel j2=new JLabel(您的最高学历?);JButton exitbtn=new JButton(退出);public Hobby()setLayout(new GridLayout(9,1);add(jl);add(c1);add(c2);add(c3);add(j2);add(rad1);add(rad2);add(rad3);add(exitbtn);public class Hobbytest exte

32、nds JFrame Hobbytest()super();getContentPane().add(new Hobby();setSize(300,200);setVisible(true);public static void main(String args)new Hobbytest();列表在可供选择的选项很多时,可向用户呈现一个列表来供他们选择JList 组件依次排列项目列表,这些项目可以单选或多选JList 类既可显示字符串,也可显示图标JList 不支持双击MouseListener 可用于解决双击问题JAVA基础培训JavaJava的的GUIGUI编程程JList 构造函数p

33、ublic JList():使用空模型构造 JListpublic JList(ListModel dataModel):构造一个列表,用它显示指定模型中的元素。public JList(Object listData):构造一个列表以显示指定数组listData的元素。JList 不支持滚动。要启用滚动,可使用下列代码:JScrollPane myScrollPane=new JScrollPane();JScrollPane myScrollPane=new JScrollPane();myScrollPane.getViewport().setView(dataList);myScrol

34、lPane.getViewport().setView(dataList);JAVA基础培训JavaJava的的GUIGUI编程程String stars=安安东尼尼奥奥.班班德德拉拉斯斯,来来昂昂纳多多.迪迪卡卡普普尼尼奥奥,桑德拉桑德拉.布洛克布洛克,休休.格格兰特特,朱莉朱莉亚.罗伯茨伯茨;JList moviestars=new JList(stars);组合框文本域和下拉列表的组合在 Swing 中,组合框由 JComboBox 表示构造函数如下:public JComboBox()public JComboBox():此构造函数使用缺省数据模型创建此构造函数使用缺省数据模型创建 J

35、ComboBoxJComboBoxpublic JComboBox(ComboBoxModel asModel)public JComboBox(ComboBoxModel asModel):使用现有使用现有 ComboBoxModel ComboBoxModel 中的项目的组合框中的项目的组合框public JComboBox(Object items)public JComboBox(Object items):包含指定数组元素的组合框包含指定数组元素的组合框JAVA基础培训JavaJava的的GUIGUI编程程String names=弗弗雷雷德德里里克克.福福西西斯斯,约翰翰.克克里里

36、沙沙姆姆,玛丽.希金斯希金斯.克拉克克拉克,帕特帕特丽夏夏.康威尔康威尔;JComboBox authors=new JComboBox(names);菜单菜单显示项目列表,指明各种任务。选择或单击某个选项时会打开另一个列表或子菜单。Swing 菜单由菜单栏、菜单和菜单项构成。菜单栏是所有菜单和菜单项的根JAVA基础培训JavaJava的的GUIGUI编程程JFC 菜单组件JAVA基础培训JavaJava的的GUIGUI编程程JMenuBarJPopupMenuAbstractButtonJSeperatorJMenuItemJMenuJCheckBoxMenuItemJRadioButton

37、MenuItemJComponentContainerComponentObjectJMenuBarJMenuBar 是可通过 JFrame、JWindow 或 JInternalFrame 的根窗格添加至容器的组件。由多个 JMenu 组成,每个 JMenu 在 JMenubar 中都表示为字符串。JMenuBar 需要两个附加类:-SingleSelectionModelSingleSelectionModel类类 :跟踪当前选定的菜单跟踪当前选定的菜单-LookAndFeelLookAndFeel类类 :负责绘制菜单栏以及对在其中发生的事件作出响应负责绘制菜单栏以及对在其中发生的事件作出

38、响应JAVA基础培训JavaJava的的GUIGUI编程程JMenuJMenu 在 JMenuBar 下以文本字符串形式显示,而在用户单击它时,则以弹出式菜单显示。JMenu 具有两个附加类:-JPopupMenu:JPopupMenu:用于显示用于显示 JMenu JMenu 的菜单项的菜单项-LookAndFeel LookAndFeel:负责绘制菜单栏中的菜单以及对在其中发生的所有事件作出负责绘制菜单栏中的菜单以及对在其中发生的所有事件作出响应响应JAVA基础培训JavaJava的的GUIGUI编程程JPopupMenu 的函数JAVA基础培训JavaJava的的GUIGUI编程程方法用

39、途public JMenuItem add(JMenuItem menuItem)将指定菜单项附加至菜单末尾public JMenuItem add(String s)使用指定文本新建菜单项,并将其添加至菜单末尾public void show(Component c,int x,int y)在组件c的坐标(x,y)位置显示弹出式菜单public boolean isPopupTrigger()确定鼠标事件是否为平台的弹出触发器JMenuItemJMenu 或 JPopupMenu 中的一个组件,以文本字符串形式显示,可以具有图标JMenuItem 的外观可以修改,如字体、颜色、背景、边框等除

40、字符串外,在 JMenuItem 中还可以添加图标JAVA基础培训JavaJava的的GUIGUI编程程JCheckBoxMenuItem将复选框作为其项目复选框是使用 JCheckBox 类创建的可有文本字符串和(或)图标在单击并释放 JCheckBoxMenuItem 时,菜单项的状态会变为选定或取消选定JAVA基础培训JavaJava的的GUIGUI编程程JRadioButtonMenuItem除了在任何时间点都只能选择一个单选按钮外,其他的与复选框类似可有文本字符串和(或)图标单击选定的单选按钮不会改变其状态单击未选定的单选按钮时将取消选定此前选定的单选按钮JAVA基础培训JavaJa

41、va的的GUIGUI编程程菜单使用示例JAVA基础培训JavaJava的的GUIGUI编程程import javax.swing.*;import java.awt.*;public class Menutest extends JFrame public Menutest()JMenuBar mb=new JMenuBar();JMenu fileMenu=new JMenu(显示);JMenu pullRightMenu=new JMenu(“问好);fileMenu.add(欢迎);fileMenu.addSeparator();fileMenu.add(pullRightMenu);f

42、ileMenu.add(退出);pullRightMenu.add(new JCheckBoxMenuItem(早上好!);pullRightMenu.add(new JCheckBoxMenuItem(下午好!);pullRightMenu.add(new JCheckBoxMenuItem(晚安!再见!);mb.add(fileMenu);setJMenuBar(mb);总结2-1vAWTAWT是用于图形界面编程是用于图形界面编程GUIGUI的类库;的类库;vGUIGUI的类库分为三种类:组件类、容器类、布局管理器的类库分为三种类:组件类、容器类、布局管理器类;类;v常用的容器有:常用的容

43、器有:FrameFrame和和PanelPanel,PanelPanel必须放在必须放在FrameFrame中;中;v常见的组件有:常见的组件有:Button,TextField,LabelButton,TextField,Label等;等;v常用的布局有:常用的布局有:FlowLayoutFlowLayout流式布局,流式布局,BorderLayoutBorderLayout边框布局,边框布局,GridLayoutGridLayout网格布局;网格布局;v可用方法为容器设置其可见性,大小,出现坐标等属可用方法为容器设置其可见性,大小,出现坐标等属性。性。JAVA基础培训JavaJava的的GUIGUI编程程总结 2-2JTextComponent是Swing文本组件的根类Swing中用于选择性输入的常用组件有:JCheckBox、JRadioButton、JList、JComboBox 菜单是 GUI 中非常有用的一部分JAVA基础培训JavaJava的的GUIGUI编程程

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁