版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA教程 第五讲 AWT图形用户界面设计多图5.1 用AWT生成图形化用户界面 抽象窗口工具包AWT (Abstract Window Toolkit 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface工具集,AWT可用于Java的applet和applications中。它支持图形用户界面编程的功能包括: 用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。java.awt包中
2、提供了GUI设计所使用的类和接口,可从图5.1中看到主要类之间的关系。 java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念:组件-Component容器-Container布局管理器-LayoutManagerJava的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。类是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性
3、等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括:getComponentAt(int x, int ygetFont(getForeground(getName(getSize(paint(Graphics grepaint(update(setVisible(boolean bsetSize(Dimension dsetName(String name等容器(Container也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。布局管理器(LayoutManager):每个
4、容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。在程序中安排组件的位置和大小时,应该注意以下两点:1容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java 语言提供的setLocation(,setSize(,setBounds( 等方法,则都会被布局管理器覆盖。2如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为
5、:setLayout(null; 1FramePhotoshop教程 数据结构 五笔输入法专题 QQ病毒专题 共享上网专题 Google工具和服务专题 查看运行结果一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize( 来设置大小,调用setVisible(true来设置该窗口为可见的。另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的
6、操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。2. Panel当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:组件的大小不变,但是相对位置会发生变化。例如上图中有三个按钮都处于同一行,但是如果把该窗口变窄,窄到刚好能够放下一个按钮,则第二个按钮将折到第二行,第三个按钮将折到第三行。按钮"Open"本来在按钮"OK"的右边,但是现在跑到了下面,所以说"组件的大小不变,但是相对位置会发生变化&qu
7、ot;。2. BorderLayoutBorderLayout 是Window,Frame和Dialog的缺省布局管理器。BorderLayout布局管理器把容器分成5个区域:North,South,East,West和Center,每个区域只能放置一个组件。各个区域的位置及大小如下图所示:North区域缺少组件布局管理器(2 4. CardLayoutCardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面。牌布局管理器(CardLayo
8、ut)就象一副叠得整整齐齐的扑克牌一样,有54张牌,但是你只能看见最上面的一张牌,每一张牌就相当于牌布局管理器中的每一层。例57事件处理机制,下一节的内容public class ThreePages implements MousListener CardLayout layout=new CardLayout(; /实例化一个牌布局管理器对象Frame f=new Frame("CardLayout"Button page1Button;Label page2Label; /Label是标签,实际上是一行字符串TextArea page3Text; /多行多列的文本区域
9、Button page3Top;Button page3Bottom;public static void main(String args new ThreePages(.go(; Public void go( f.setLayout(layout; /设置为牌布局管理器layoutf.add(page1Button=new Button("Button page","page1Button" /*第二个参数"page1Button"表示的是你对这层牌所取的名字*/page1Button.addMouseListener(this
10、; /注册监听器f.add(page2Label=new Label("Label page","page2Label"page2Label.addMouseLisener(this; /注册监听器Panel panel=new Panel(;panel.setLayout(new BorderLayout(;panel.add(page3Text=new TextArea("Composite page","Center"page3Text.addMouseListener(this; panel.add(pag
11、e3Top=new Button("Top button" , "North"page3Top.addMouseListener(this;panel.add(page3Bottom=new Button("Bottom button" ,"South"page3Bottom.addMouseListener(this;f.add(panel,"panel"f.setSize(200,200;f.setVisible(true;5容器的嵌套在复杂的图形用户界面设计中,为了使布局更加易于管理,具有
12、简洁的整体风格,一个包含了多个组件的容器本身也可以作为一个组件加到另一个容器中去,容器中再添加容器,这样就形成了容器的嵌套。下面是一个容器嵌套的例子。例58public class ExGui3private Frame f;private Panel p;private Button bw,bc;private Button bfile,bhelp;public static void main(String argsExGui3 gui = new ExGui3(;gui.go(; public void go(f = new Frame("GUI example 3"
13、bw=new Button("West"bc=new Button("Work space region"f.add(bw,"West"f.add(bc,"Center"p = new Panel(;f.add(p,"North"bfile= new Button("File"bhelp= new Button("Help"p.add(bfile;p.add(bhelp;f.pack(;f.setVisible(true;查看运行结果小 结:1Frame是
14、一个顶级窗口。Frame的缺省布局管理器为BorderLayout。2Panel 无法单独显示,必须添加到某个容器中。 Panel 的缺省布局管理器为FlowLayout。3当把Panel 作为一个组件添加到某个容器中后,该Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某个区域显示多个组件,达到设计复杂用户界面的目的 。4如果采用无布局管理器 setLayout(null,则必须使用setLocation(,setSize(,setBounds(等方法手工设置组件的大小和位置,此方法会导致平台相关,不鼓励使用。 5.2 AWT事件处理模型上一
15、节中的主要内容是如何放置各种组件,使图形界面更加丰富多彩,但是还不能响应用户的任何操作,要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及三类对象: Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。 Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮Button。 Event handler-事件处理者,接收事件对象并对其进行处理的对象例如,如果用户用鼠标单击了按钮对象button,则该按钮button就是事件源,而java运行时系统会生成ActionEve
16、nt类的对象actionE,该对象中描述了该单击事件发生时的一些信息,然后,事件处理者对象将接收由java运行时系统传递过来的事件对象actionE并进行相应的处理。由于同一个事件源上可能发生多种事件,因此java采取了授权处理机制(Delegation Model,事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。比如在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以授权给事件处理者一来处理鼠标事件,同时授权给事件处理者二来处理键盘事件。有时也将事件处理者称为监听器,主要原因也在于监听器时刻监听着事件源上所有发生的事件类型,一旦该事件类
17、型与自己所负责处理的事件类型一致,就马上进行处理。授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型相对的接口。例如例5.9中类ButtonHandler之所以能够处理ActionEvent事件,原因在于它实现了与ActionEvent事件对应的接口ActionListener。每个事件类都有一个与之相对应的接口。将事件源对象和事件处理器(事件监听器)分开。如图5.2所示打个不太恰当的比喻,比如说有一位李先生,李先生可能会发生很多法律纠纷,可能是民事法律纠纷,也可能是刑事
18、法律纠纷,那么李先生可以请律师,他可以授权王律师负责帮他打民事法律的官司,同时也可以授权张律师帮他打刑事法律的官司。这个请律师的过程从李先生的角度来看,就是授权的过程,而从王律师和张律师的角度来看,一旦被授权,他们就得时刻对李先生负责,"监听"着李先生,一旦发生民事纠纷了,王律师就要马上去处理,而一旦发生刑事纠纷了,张律师就要马上进行处理。此时此刻,李先生就是事件源,王律师是一个事件处理者,张律师是另外一个事件处理者,民事纠纷和刑事纠纷就是不同类型的事件。例5.9public class TestButton public static void main(String a
19、rgsFrame f = new Frame("Test"Button b = new Button("Press Me!"b.addActionListener(new ButtonHandler(; /*注册监听器进行授权,该方法的参数是事件处理者对象,要处理的事件类型可以从方法名中看出,例如本方法要授权处理的是ActionEvent,因为方法名是addActionListener。*/f.setLayout(new FlowLayout(; /设置布局管理器f.add(b;f.setSize(200,100;f.setVisible(true;cl
20、ass ButtonHandler implements ActionListener /实现接口ActionListener才能做事件ActionEvent的处理者public void actionPerformed(ActionEvent e /系统产生的ActionEvent事件对象被当作参数传递给该方法/本接口只有一个方法,因此事件发生时,系统会自动调用本方法,需要做的操作就把代码写在则个方法里。使用授权处理模型进行事件处理的一般方法归纳如下:1对于某种类型的事件XXXEvent, 要想接收并处理这类事件,必须定义相应的事件监听器类,该类需要实现与该事件相对应的接口XXXListen
21、er;2事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener 方法来注册监听器。 Photoshop教程 数据结构 五笔输入法专题 QQ病毒专题 共享上网专题 Google工具和服务专题 与AWT有关的所有事件类都由类派生,它也是EventObject类的子类。AWT事件共有10类,可以归为两大类:低级事件和高级事件。类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承于类,这些AWT事件分为两大类:低级事件和高级事件,低级事件是指基于组件和容器的事件,当一个组件上发生事件,如:鼠标的进入,点击,拖放
22、等,或组件的窗口开关等,触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。 低级事件ComponentEvent( 组件事件:组件尺寸的变化,移动) ContainerEvent( 容器事件:组件增加,移动) WindowEvent( 窗口事件:关闭窗口,窗口闭合,图标化) FocusEvent( 焦点事件:焦点的获得和丢失) KeyEvent( 键盘事件:键按下、释放)
23、MouseEvent( 鼠标事件:鼠标单击,移动) 高级事件(语义事件)ActionEvent(动作事件:按钮按下,TextField中按Enter键)AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值)ItemEvent(项目事件:选择项目,不选择"项目改变")TextEvent(文本事件,文本对象改变) 每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。例如,与键盘事件KeyEvent相对应的接口是:public interface KeyListener extends EventListener public void keyPre
24、ssed(KeyEvent ev;public void keyReleased(KeyEvent ev;public void keyTyped(KeyEvent ev;注意到在本接口中有三个方法,那么java运行时系统何时调用哪个方法?其实根据这三个方法的方法名就能够知道应该是什么时候调用哪个方法执行了。当键盘刚按下去时,将调用keyPressed( 方法执行,当键盘抬起来时,将调用keyReleased( 方法执行,当键盘敲击一次时,将调用keyTyped( 方法执行。又例如窗口事件接口: public interface WindowListener extends EventList
25、enerpublic void windowClosing(WindowEvent e; /把退出窗口的语句写在本方法中public void windowOpened(WindowEvent e; /窗口打开时调用public void windowIconified(WindowEvent e; /窗口图标化时调用public void windowDeiconified(WindowEvent e; /窗口非图标化时调用public void windowClosed(WindowEvent e;/窗口关闭时调用public void windowActivated(WindowEven
26、t e; /窗口激活时调用public void windowDeactivated(WindowEvent e; /窗口非激活时调用AWT的组件类中提供注册和注销监听器的方法: 注册监听器:public void add ( listener; 注销监听器:public void remove ( listener; 例如Button类:(查API)public class Button extends Component public synchronized void addActionListener(ActionListener l;public synchronized void
27、removeActionListener(ActionListener l;事件及其相应的监听器接口(1表5.1列出了所有AWT事件及其相应的监听器接口,一共10类事件,11个接口。下面这张表应能牢牢记住。表5.1事件类别描述信息接口名方法ActionEvent 激活组件ActionListener actionPerformed(ActionEvent ItemEvent 选择了某些项目ItemListener itemStateChanged(ItemEvent MouseEvent 鼠标移动MouseMotionListener mouseDragged(MouseEventmouseM
28、oved(MouseEvent 鼠标点击等MouseListener mousePressed(MouseEventmouseReleased(MouseEventmouseEntered(MouseEventmouseExited(MouseEvent mouseClicked(MouseEvent KeyEvent 键盘输入KeyListener keyPressed(KeyEventkeyReleased(KeyEventkeyTyped(KeyEvent FocusEvent 组件收到或失去焦点FocusListener focusGained(FocusEventfocusLost(
29、FocusEvent AdjustmentEvent 移动了滚动条等组件AdjustmentListener adjustmentValueChanged(AdjustmentEvent ComponentEvent 对象移动缩放显示隐藏等ComponentListener componentMoved(ComponentEventcomponentHidden(ComponentEventcomponentResized(ComponentEventcomponentShown(ComponentEvent WindowEvent 窗口收到窗口级事件WindowListener window
30、Closing(WindowEventwindowOpened(WindowEventwindowIconified(WindowEventwindowDeiconified(WindowEventwindowClosed(WindowEventwindowActivated(WindowEventwindowDeactivated(WindowEvent ContainerEvent 容器中增加删除了组件ContainerListener componentAdded(ContainerEventcomponentRemoved(ContainerEvent TextEvent 文本字段或文
31、本区发生改变TextListener textValueChanged(TextEvent public void go( f = new Frame("Three listeners example" f.add(new Label("Click and drag the mouse","North"tf = new TextField(30;f.add(tf,"South" /使用缺省的布局管理器f.addMouseMotionListener(this; /注册监听器MouseMotionList
32、enerf.addMouseListener(this; /注册监听器MouseListenerf.addWindowListener(this; /注册监听器WindowListenerf.setSize(300,200;f.setVisible(true; public void mouseDragged (MouseEvent e /实现mouseDragged方法String s = "Mouse dragging : X="+e.getX(+"Y = "+e.getY(;tf.setText(s;public void mouseMoved(M
33、ouseEvent e /对其不感兴趣的方法可以方法体为空public void mouseClicked(MouseEvent epublic void mouseEntered(MouseEvent eString s = "The mouse entered"tf.setText(s;public void mouseExited(MouseEvent eString s = "The mouse has left the building"tf.setText(s; public void mousePressed(MouseEvent epub
34、lic void mouseReleased(MouseEvent e public void windowClosing(WindowEvent e /为了使窗口能正常关闭,程序正常退出,需要实现windowClosing方法System.exit(1;public void windowOpened(WindowEvent e /对其不感兴趣的方法可以方法体为空public void windowIconified(WindowEvent e public void windowDeiconified(WindowEvent e public void windowClosed(Windo
35、wEvent e public void windowActivated(WindowEvent e public void windowDeactivated(WindowEvent e 上例中有如下几个特点:1可以声明多个接口,接口之间用逗号隔开。implements MouseMotionListener, MouseListener, WindowListener;2可以由同一个对象监听一个事件源上发生的多种事件:f.addMouseMotionListener(this;f.addMouseListener(this;f.addWindowListener(this;则对象f 上发生
36、的多个事件都将被同一个监听器接收和处理。3事件处理者和事件源处在同一个类中。本例中事件源是Frame f,事件处理者是类ThreeListener,其中事件源Frame f是类ThreeListener的成员变量。4可以通过事件对象获得详细资料,比如本例中就通过事件对象获得了鼠标发生时的坐标值。public void mouseDragged(MouseEvent e String s="Mouse dragging :X="+e.getX(+"Y="+e.getY(;tf.setText(s;Java语言类的层次非常分明,因而只支持单继承,为了实现多重
37、继承的能力,Java用接口来实现,一个类可以实现多个接口,这种机制比多重继承具有更简单、灵活、更强的功能。在AWT中就经常用到声明和实现多个接口。记住无论实现了几个接口,接口中已定义的方法必须一一实现,如果对某事件不感兴趣,可以不具体实现其方法,而用空的方法体来代替。但却必须所有方法都要写上。 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。 编写事件驱动程序,内部类很方便。因此内部类所能够应用的地方往往是在AWT的事件处理机制中。class MyMouseMotionListener extends MouseMot
38、ionAdapter /*内部类开始*/public void mouseDragged(MouseEvent e String s="Mouse dragging: x="+e.getX(+"Y="+e.getY(;tf.setText(s; ;public static void main(String args InnerClass obj=new InnerClass(;obj.launchFrame(;/内部类结束Photoshop教程 数据结构 五笔输入法专题 QQ病毒专题 共享上网专题 Google工具和服务专题 5.3 AWT
39、组件库(1本节从应用的角度进一步介绍AWT的一些组件,目的使大家加深对AWT的理解,掌握如何用各种组件构造图形化用户界面,学会控制组件的颜色和字体。下面是一些常用的组件的介绍:1 按钮(Button按钮是最常用的一个组件,其构造方法是:Button b = new Button("Quit" 当按钮被点击后,会产生ActionEvent事件,需ActionListener接口进行监听和处理事件。ActionEvent的对象调用getActionCommand(方法可以得到按钮的标识名,缺省按钮名为label。用setActionCommand(可以为按钮设置组件标识符。 3
40、.复选框组(CheckboxGroup使用复选框组,可以实现单选框的功能。方法如下: setLayout(new GridLayout(3, 1;CheckboxGroup cbg = new CheckboxGroup(;add(new Checkbox("one", cbg, true;add(new Checkbox("two", cbg, false;add(new Checkbox("three", cbg, false;查看运行结果 5.3 AWT组件库(24. 下拉式菜单(Choice)下拉式菜单每次只能选择其中的一项,
41、它能够节省显示空间,适用于大量选项。Choice Colorchooser=new Choice(;Colorchooser.add("Green"Colorchooser.add("Red"Colorchooser.add("Blue"Choice 用ItemListener接口来进行监听 5. Canvas一个应用程序必须继承Canvas类才能获得有用的功能,比如创建一个自定义组件。如果想在画布上完成一些图形处理,则Canvas类中的paint()方法必须被重写。Canvas组件监听各种鼠标,键盘事件。当在Canvas组件中输入字
42、符时,必须先调用requestFocus(方法。6. 单行文本输入区(TextField只能显示一行,当回车键被按下时,会发生ActionEvent事件,可以通过ActionListener中的actionPerformed(方法对事件进行相应处理。可以使用setEditable(boolean方法设置为只读属性。单行文本输入区构造方法如下:TextField tf1,tf2,tf3,tf4:tf1=new TextField(; tf2=new TextField("",20; /显示区域为20列tf3=new TextField("Hello!" /
43、按文本区域大小显示tf4=new TextField("Hello!",30; /初始文本为Hello!, 显示区域为30列 Photoshop教程 数据结构 五笔输入法专题 QQ病毒专题 共享上网专题 Google工具和服务专题 5.3 AWT组件库(37. 文本输入区(TextArea)TextArea可以显示多行多列的文本。使用setEditable(boolean方法,可以将其设置为只读的。在TextArea中可以显示水平或垂直的滚动条。要判断文本是否输入完毕,可以在TextArea旁边设置一个按钮,通过按钮点击产生的ActionEvent对输入的文本进
44、行处理。 8. 列表(List列表中提供了多个文本选项,列表支持滚动条,可以浏览多项List lst=new List(4,false; /两个参数分别表示显示的行数、是否允许多选lst.add("Venus"lst.add("Earth"lst.add("JavaSoft"lst.add("Mars"cnt.add(lst;9. 框架(Frame)Frame是顶级窗口,可以显示标题,重置大小。当Frame被关闭,将产生WindowEvent事件,Frame无法直接监听键盘输入事件。10. 对话框(Dialog)它
45、是Window类的子类。对话框和一般窗口的区别在于它依赖于其它窗口。对话框分为非模式(non-modal)和模式(modal)两种。11. 文件对话框(Filedialog当用户想打开或存储文件时,使用文件对话框进行操作。主要代码如下:FileDialog d=new FileDialog(ParentFr,"FileDialog"d.setVisible(true;String filename=d.getFile(;12. 菜单(Menu)无法直接将菜单添加到容器的某一位置,也无法使用布局管理器对其加以控制。菜单只能被添加?quot;菜单容器"(MenuBar)中。13. MenuBar只能被添加到Frame对象中,作为整个菜单树的根基。Frame fr = new Frame("MenuBar"MenuBar mb = new MenuBar(;fr.setMenuBar(mb;fr.setSize(150,100;fr.setVisible(true;14. Menu下拉菜单。它可以被添加到Menu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗器械经营企业岗位职责培训试题及答案
- 180红色夕阳人物剪影背景的《人生》路遥文学小说读书分享下载 2
- 产科安全管理制度培训
- 品管圈在预防VTE质量管理中的应用研究
- 第5课《一着惊海天》逢主学习导学单 2025-2026学年统编版八年级语文上册(学案)
- 企业办公室安全职责培训
- 车床安全作业制度培训课件
- 实习生安全规程培训课件
- 食品添加剂管理及使用记录制度培训
- 2026年常德职业技术学院单招职业技能考试题库含答案详解(夺分金卷)
- 2026广东汕头市公安局招聘警务辅助人员152人考试参考试题及答案解析
- 施工机械安全防护方案
- 危险品全员安全培训方案课件
- 屋顶彩钢瓦施工流程
- 2026年江西应用技术职业学院单招职业技能测试题库带答案详解
- 五个带头方面整改措施
- DB31∕T 1597-2025 老年人屈光不正社区筛查规范
- DB32∕T 5276-2025 木结构人行桥梁技术规程
- 2025年初级特种消防车驾驶员《理论知识》考试真题(含新版解析)
- 2025年REACH第35批SVHC高度关注物质清单251项
- 叙事护理在肿瘤患者护理中的实践
评论
0/150
提交评论