




已阅读5页,还剩99页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,Swing图形用户界面程序设计,2,主要内容,简介容器组件基本组件布局管理器事件处理模型高级图像用户界面,3,8.1简介,图形用户界面(GUI)数据的图形显示形式友好的交互方式简化计算机软件的学习过程GUI示例jdk1.6demojfcSwingSet2GUI组件:Labels,Textfields,Buttons等等,4,1、关于SwingGUI组件,SwingGUI组件所在的包:javax.swingSwing组件的平台相关性较小(lightweight)早期版本的GUI组件所在的包:java.awt与平台相关性较强,5,2、Swing特性,100%的纯Java实现可插入的外观感觉(PluggableLookandFeel,PLpublicclassFrameDemoFramef;Buttonb;publicFrameDemo()f=newFrame(FrameDemo);b=newButton(Pressme);f.add(b);f.setSize(200,200);f.setVisible(true);publicstaticvoidmain(Stringargs)newFrameDemo();,13,例2:基于Swing实现的框架界面,importjava.awt.*;importjavax.swing.*;publicclassJFrameDemoJFramef;JButtonb;Containerc;publicJFrameDemo()f=newJFrame(JFrameDemo);b=newJButton(Pressme);c=f.getContentPane();c.add(b);f.setSize(200,200);f.setVisible(true);publicstaticvoidmain(Stringargs)newJFrameDemo();,14,在JFrame中加入组件的方法,1)用getContentPane()方法获得JFrame的内容面板,再对其加入组件:Containerc=frame.getContentPane()c.add(childComponent)2)建立一个JPanel或JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板:JPanelcontentPane=newJPanel();/把其它组件添加到Jpanel中;frame.setContentPane(contentPane);/把contentPane对象设置成为frame的内容面板,15,2、JPanel(面板),一种中间容器,用来组成其它组件可以添加各种组件(包括面板组件)面板(JPanel)的大小由它所包含的组件决定当组件个数增加,面板(JPanel)也会随之而增大,16,例3:利用JPanel创建界面,importjava.awt.*;importjavax.swing.*;publicclassJPanelDemoextendsJFramepublicJPanelgetGUI()JPanelp=newJPanel();p.add(newJButton(Pressme);returnp;publicJPanelDemo()super(JPanelDemo);setContentPane(getGUI();setSize(200,200);setVisible(true);publicstaticvoidmain(Stringargs)newJPanelDemo();,importjava.awt.*;importjavax.swing.*;publicclassJPanelDemoextendsJFramepublicJPanelgetGUI()JPanelp=newJPanel();p.add(newJButton(Pressme);returnp;publicstaticvoidmain(Stringargs)JPanelDemojp=newJPanelDemo();jp.setTitle(JPanelDemo);jp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jp.setContentPane(jp.getGUI();jp.setSize(200,200);jp.setVisible(true);,17,3、JScrollPane(滚动窗口面板),JScrollPane是带滚动条的面板,主要是通过移动JViewport(视口)来实现的。JViewport是一种特殊的对象,用于查看基层组件,滚动条实际就是沿着组件移动视口,同时描绘出它在下面看到的内容。,18,滚动窗口(JScrollPane)效果图,19,4、JSplitPane(分隔板),JSplitPane提供可拆分窗口,支持水平拆分(JSplitPane.HORIZONTAL_SPLIT)和垂直(JSplitPane.VERTICAL_SPLIT)拆分并带有滑动条。常用方法有:JSplitPane(intnewOrientation,ComponentnewLeftComponent,ComponentnewRightComponent)创建一个具有指定方向和指定组件的新JSplitPane。addImpl(Componentcomp,Objectconstraints,intindex)/增加指定的组件setTopComponent(Componentcomp)/设置顶部的组件setDividerSize(intnewSize)/设置拆分的大小setUI(SplitPaneUIui)/设置外观和感觉,20,分隔板(JSplitPane)效果图,21,8.3基本组件,标签(JLabel)文本框(JTextField)按钮(JButton)组合框(JComboBox)文本(JTextArea)列表JList(单选列表和多选列表),22,1、标签(JLabel),标签为GUI提供文本(主要)或图像(也可以)信息对应类(JLabel)(JComponent的子类)可以显示:单行的只读的文本信息图像同时显示文本与图像信息程序一般不修改标签的内容,23,例4:JLabel的演示例子,importjava.awt.Container;importjava.awt.FlowLayout;importjavax.swing.ImageIcon;importjavax.swing.JFrame;importjavax.swing.JLabel;publicclassJLabelDemoextendsJFramepublicJLabelDemo()super(框架和标签例程);Strings=文本标签,文字在图标的左侧,文字在图标的下方;ImageIconic=null,newImageIcon(img1.gif),newImageIcon(img2.gif);intih=0,JLabel.LEFT,JLabel.CENTER;intiv=0,JLabel.CENTER,JLabel.BOTTOM;Containerc=getContentPane();c.setLayout(newFlowLayout(FlowLayout.LEFT);,24,例4:JLabel的演示例子(续),for(inti=0;i0)aLabel.setHorizontalTextPosition(ihi);aLabel.setVerticalTextPosition(ivi);aLabel.setToolTipText(第+(i+1)+个标签);c.add(aLabel);publicstaticvoidmain(Stringargs)JLabelDemoapp=newJLabelDemo();app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(360,150);app.setVisible(true);,25,2、文本框(JTextField),显示单行的文本信息JTextFieldextendsJTextComponent密码输入框JPasswordField,26,例5:JTextField的演示例子,importjava.awt.Container;importjava.awt.FlowLayout;importjavax.swing.JFrame;importjavax.swing.JPasswordField;importjavax.swing.JTextField;publicclassJTextFieldDemopublicstaticvoidmain(Stringargs)JFrameapp=newJFrame(文本编辑框例程);app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(320,120);Containerc=app.getContentPane();c.setLayout(newFlowLayout();JTextFieldt=newJTextField(正常文本:,8),newJTextField(显示,15),newJTextField(密码文本:,8),newJPasswordField(隐藏,15);t0.setEditable(false);t2.setEditable(false);for(inti=0;i4;i+)c.add(ti);app.setVisible(true);,27,3、按钮(JButton),当鼠标左键单击按钮组件时,能触发特定的事件在Java中,广义的按钮包括:命令式按钮(JButton)复选框(JCheckBox)单选按钮(JRadioButton),28,按钮类的层次结构,29,Containerc=getContentPane();c.setLayout(newFlowLayout();inti;ImageIconic=newImageIcon(left.gif),newImageIcon(right.gif);JButtonb=newJButton(左,ic0),newJButton(中间),newJButton(右,ic1);for(i=0;ib.length;i+)c.add(bi);JCheckBoxck=newJCheckBox(左),newJCheckBox(右);for(i=0;ick.length;i+)c.add(cki);cki.setSelected(true);JRadioButtonr=newJRadioButton(左),newJRadioButton(右);ButtonGrouprg=newButtonGroup();for(i=0;ir.length;i+)c.add(ri);rg.add(ri);r0.setSelected(true);r1.setSelected(false);,30,4、组合框(JComboBox),组合框(JComboBox)可以从下拉式的列表框中选取其中的列表项有时也称为下拉框(drop-downlist)类JComboBox中的方法getSelectedIndex()返回当前被选中的项setMaximumRowCount(n)设置最多显示列表项的项数滚动条(Scrollbar)会自动加上,31,5、文本(JTextArea),JTextArea是一个显示纯文本的多行区域。JTextArea不管理滚动,可把它放置在JScrollPane的ViewPort中实现滚动,如:JTextAreatextArea=newJTextArea();JScrollPanearea=newJScrollPane(textArea);TextArea具有换行能力,JTextArea默认为不换行,需设置换行策略,如:textArea.setLineWrap(true);textArea.setWrapStyleWord(true);,32,JTextArea的代码段,/建立容纳文本区的面板JPaneltextPanel=newJPanel();/新建无回绕的文本区,行数为5,列数为20noWrapArea=newJTextArea(nowrap,5,20);/新建有回绕的文本区,行数为5,列数为20wrapArea=newJTextArea(wraparea,5,20);wrapArea.setLineWrap(true);/新建带滚动条的文本区,行数为5,列数为20scrollArea=newJTextArea(scrollarea,5,20);/将文本区插入到滚动窗格中JScrollPanescrollPane=newJScrollPane(scrollArea);textPanel.add(noWrapArea);textPanel.add(wrapArea);/将滚动窗格加入到框架中textPanel.add(scrollPane);,33,6、列表JList,JList显示出一系列选项,用户可以从中选择一个或多项。StringcolorNames=“Black”,“Blue”,“Cyan”,“DarkGray”,“Gray“;colorList=newJList(colorNames);colorList.setVisibleRowCount(5);colorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);colorList.getSelectedIndex();colorList.getSelectedValue();,34,多选列表,在JList中选择多个选项,方法是按住shift键或ctrl键。多选列表没有和多个选择相关的事件。通常由另一个GUI组件生成的事件(外部事件)来指定处理JList中的多个选择。,35,多选列表的使用方法,StringcolorNames=“Black”,“Blue”,“Cyan”,“DarkGray”,“Gray“;JListcolorList=newJList(colorNames);colorList.setVisibleRowCount(5);colorList.setFixedCellHeight(15);colorList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);colorList.getSelectedValues(),36,8.4布局管理器,用来控制组件在容器中的布局方式应当尽量利用已有的基本布局方式布局管理器处理组件布局的大部分细节,37,布局管理器,流式布局FlowLayout边界布局BorderLayout盒式布局管理器BoxLayout网格布局GridLayout卡片布局CardLayout网格包布局GridBagLayout,38,1、流式布局FlowLayout,是一种最基本的布局管理器是java.awt.Applet、java.awt.Panel和javax.swing.JPanel的默认布局方式在容器中,从左到右依次放置GUI组件当组件排到容器一行的末尾时,则从下一行开始接着排列组件每行组件的对齐方式可以是:左对齐、中间(默认对齐方式)和右对齐,39,FlowLayout的构造方法,publicFlowLayout()publicFlowLayout(intalignment)publicFlowLayout(intalignment,inthorizontalGap,intverticalGap)alignment参数的值必须是FlowLayout.LEFT、Flowlayout.CENTER或FlowLayout.RIGHT。horizontalGap和verticalGap参数指定了组件间隔距离(以像素为单位)。FlowLayout的默认间隔值为5。,40,例6:FlowLayout的使用方法,importjava.awt.*;importjavax.swing.*;publicclassFlowLayoutDemoextendsJFramepublicFlowLayoutDemo()Containerc=getContentPane();c.setLayout(newFlowLayout();c.add(newJLabel(Buttons:);c.add(newJButton(Button1);c.add(newJButton(2);c.add(newJButton(Button3);c.add(newJButton(Long-NamedButton4);c.add(newJButton(Button5);publicstaticvoidmain(Stringargs)FlowLayoutDemowindow=newFlowLayoutDemo();window.setTitle(FlowLayoutDemo);window.pack();/窗口大小设置为适合组件最佳尺寸与布局所需的空间window.setVisible(true);,41,2、边界布局BorderLayout,是容器JFrame和JApplet的默认布局方式将容器分成五个区域,NORTH(顶部)SOUTH(底部)WEST(左侧)EAST(右侧)CENTER(中间)每个区域最多只能1个组件,42,BorderLayout的方法,构造方法:BorderLayout()构造一个组件之间没有间距的新边界布局。BorderLayout(inthgap,intvgap)用指定的组件之间的水平间距构造一个边界布局。将组件添加到BorderLayout布局的容器中的方法add(newButton(South),BorderLayout.SOUTH);add(newButton(South),South);add(South,newButton(South);,43,例7:BorderLayout的使用方法,importjava.awt.*;importjavax.swing.*;publicclassBorderLayoutDemoextendsJFramepublicBorderLayoutDemo()Containerc=getContentPane();c.setLayout(newBorderLayout(5,5);c.add(newJButton(North),North);c.add(newJButton(South),South);/c.add(South,newButton(South);/c.add(newButton(South),BorderLayout.SOUTH);c.add(newJButton(East),East);c.add(newJButton(West),West);c.add(newJButton(Center),Center);publicstaticvoidmain(Stringargs)BorderLayoutDemowindow=newBorderLayoutDemo();window.setTitle(BorderLayoutDemo);window.pack();window.setVisible(true);,44,3、盒式布局管理器BoxLayout,允许多个组件在容器中沿水平方向或竖直方向排列容器的大小发生变化时,组件占用的空间不会发生变化,45,BoxLayout的方法,构造方法:BoxLayout(Containertarget,intaxis)创建一个将沿给定轴放置组件的布局管理器。轴的方向:BoxLayout.X_AXIS:指定组件应该从左到右放置BoxLayout.Y_AXIS:指定组件应该从上到下放置,46,例8:BoxLayout使用的例子,importjava.awt.Container;importjavax.swing.BoxLayout;importjavax.swing.JButton;importjavax.swing.JFrame;publicclassBoxLayoutDemopublicstaticvoidmain(Stringargs)JFrameapp=newJFrame(盒式布局管理器例程);app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(220,130);Containerc=app.getContentPane();c.setLayout(newBoxLayout(c,BoxLayout.X_AXIS);Strings;JButtonb;for(inti=0;i3;i+)s=按钮+(i+1);b=newJButton(s);c.add(b);app.setVisible(true);,47,4、网格布局GridLayout,布局管理器GridLayout按行与列将容器等分成网格每个组件占用具有相同宽度和高度的网格添加组件占用网格的顺序:从上到下,从左到右当一行满了,则继续到下一行,仍然是从左到右,48,GridLayout类的构造方法,GridLayout()创建默认值的网格布局,即每个组件占据一行一列。GridLayout(introws,intcols)创建具有指定行数和列数的网格布局GridLayout(introws,intcols,inthgap,intvgap)创建具有指定行数和列数的网格布局。,49,例9:GridLayout的使用方法,importjava.awt.*;importjavax.swing.*;publicclassGridLayoutDemoJFramef;publicGridLayoutDemo(Stringstr)f=newJFrame(str);Containerc=f.getContentPane();c.setLayout(newGridLayout(3,2);for(inti=1;i=6;i+)c.add(newJButton(i+);f.pack();f.setVisible(true);publicstaticvoidmain(Stringargs)newGridLayoutDemo(GridLayoutDemo);,50,5、卡片布局管理器CardLayout,CardLayout的布局方式有点象码“扑克牌”一个组件压在另一个组件的上面,所以每次一般只能看到一个组件,51,6、网格包布局GridBagLayout,GridBagLayout是AWT包中提供的最灵活、最复杂的布局管理器。GridBagLayout将组件以多行多列放置,允许指定的组件跨多行或多列。每个GridBagLayout对象保留一个动态的矩形单元网格,每个组件占用一个或多个单元,称为它的显示区域。每个由一个网格元包布局管理的组件都与一个GridBagConstraints的实例相关,它指定了组件在它的显示区域是如何放置的。,52,使用布局管理器的基本规则,(1)若组件尽量充满容器空间,可以考虑使用BorderLayout和GridBagLayout。(2)若用户需要在紧凑的一行中以组件的自然尺寸显示较少的组件,用户可以考虑用面板容纳组件,并使用面板的默认布局管理器FlowLayout。(3)若用户需要在多行或多列中显示一些同样尺寸的组件,GridLayout最适合此情况。(4)若界面较为复杂,可先使用面板来容纳组件,然后选用适当的布局管理器。,53,布局管理器嵌套,实际上是容器的嵌套,被嵌套的容器可以具有不同的布局管理器在嵌套的布局管理器中JPanel通常起到了“桥”的作用,54,例10:复杂GUI的布局,55,例10:实现GUI的步骤分析,56,GUI的设计步骤,先设计一个窗口,如JFrame确定布局管理器在窗口中添加所需组件增加事件处理,57,8.5事件处理模型,GUI是由事件(event)驱动的当用户与GUI交互可以产生事件(events)一些常见的交互方式移动鼠标用鼠标点击按钮在文本框中输入数据关闭窗口等,58,事件处理,用户交互,事件,如:单击鼠标,如:按下/释放鼠标按钮,对象状态改变,调用事件处理,确定发生的事件的类型,确定生成的事件的组件,编写合适的代码处理事件,事件作用于对象。对象识别事件并做出响应,不同的对象能识别的事件不全相同。可以针对相应的事件编写相应的代码,在事件发生时,程序执行事件里的代码。,59,事件处理模型,源对象,监听器,事件,传播,事件的实例,方法,传递途径,代理事件模型,Swing中的GUI组件,适配器对象,60,事件处理机制,主要涉及三种对象事件源(Aneventsource)事件对象(Aneventobject)事件监听器(eventlistener(s),61,事件处理机制,事件源可供用户进行交互的GUI组件事件对象封装了包含所发生的各种事件的有效信息信息包括:事件源的引用、以及事件监听器在处理事件时所需要的其它各种信息事件信息被包含在类AWTEvent或其子类的实例对象中事件监听器接受事件对象,并处理事件对象,62,事件处理机制,包含事件处理的程序应该包括以下四部分内容:1、引入系统事件类包,如importjava.awt.event.*。2、在事件处理类的声明中指定要实现的监听器名,如:publicclassMyClassimplementsActionListener3、注册事件源对象的事件监听者,如btn.addActionListener(this)。4、实现监听器中的接口如实现按钮事件监听接口ActionListener:publicvoidactionPerformed(ActionEvente)./响应某个动作的代码.,63,事件分类与监听器接口,1、事件分类,java.util.EventObject,Java.awt.AWTEvent,ActionEventAdjustmentEventComponentEventItemEventTextEvent,ContainerEventFocusEventWindowEventPaintEventInputEvent,MouseEvent,KeyEvent,64,2、监听器接口,对于每种类型的事件,都定义了相应的事件处理接口;XXXEvent对应的事件处理接口通常为XXXListener。,java.util.EventListener,ActionListenerItemListenerWindowListenerKeyListenerMouseListenerMouseMotionListener,65,事件接口及处理方法,66,事件接口及处理方法(续),67,例11:按钮事件的示例(方法1),importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestJButtonimplementsActionListenerpublicTestJButton()JFramef=newJFrame(TestButtonEvent!);Containerc=f.getContentPane();JButtonb=newJButton(PressMe!);b.addActionListener(this);c.add(b,Center);f.setSize(200,100);f.setVisible(true);publicvoidactionPerformed(ActionEvente)System.out.println(Actionoccurred);System.out.println(Buttonslabelis:+e.getActionCommand();publicstaticvoidmain(Stringargs)newTestJButton();,方法1:采用同一个类中实现事件接口的方法,68,例:按钮事件的示例(方法2),importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestJButtonDemopublicTestJButtonDemo()JFramef=newJFrame(TestButtonEvent!);Containerc=f.getContentPane();JButtonb=newJButton(PressMe!);b.addActionListener(newButtonHandler();c.add(b,Center);f.setSize(200,100);f.setVisible(true);publicstaticvoidmain(Stringargs)newTestJButtonDemo();,69,例11:按钮事件的示例(方法2),importjava.awt.event.*;publicclassButtonHandlerimplementsActionListenerpublicvoidactionPerformed(ActionEvente)System.out.println(Actionoccurred);System.out.println(Buttonslabelis:+e.getActionCommand();,方法2:采用另一个类中实现事件接口的方法,70,例11:按钮事件的示例(方法3),importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestInnerButtonDemopublicTestInnerButtonDemo()JFramef=newJFrame(TestButtonEvent!);Containerc=f.getContentPane();JButtonb=newJButton(PressMe!);b.addActionListener(newActionListener()publicvoidactionPerformed(ActionEvente)System.out.println(Actionoccurred);System.out.println(Buttonslabelis:+e.getActionCommand(););c.add(b,Center);f.setSize(200,100);f.setVisible(true);publicstaticvoidmain(Stringargs)newTestInnerButtonDemo();,方法3:采用匿名内部类实现事件接口的方法,71,如何监听多个组件事件?,例12:编写一个允许学生在文本字段中输入一个数的程序。创建一个每当用户单击一次就将此数加一的按钮。创建另一个每当用户单击一次就将此数减一的按钮。界面效果如下图所示。,72,importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;classIncrementorimplementsActionListenerJTextFieldnumberTxf;JButtonincrementBtn,decrementBtn;publicvoidmakeGUI()JFramefrm=newJFrame(Incrementor);Containerc=frm.getContentPane();c.setLayout(newFlowLayout();numberTxf=newJTextField(0,5);c.add(numberTxf);incrementBtn=newJButton(Increment);c.add(incrementBtn);incrementBtn.addActionListener(this);decrementBtn=newJButton(Decrement);c.add(decrementBtn);decrementBtn.addActionListener(this);frm.setSize(300,100);frm.setVisible(true);,73,publicvoidactionPerformed(ActionEvente)intoldNum=Integer.parseInt(numberTxf.getText();intnewNum=oldNum;if(e.getActionCommand().equals(Increment)newNum+;elseif(e.getActionCommand().equals(Decrement)newNum-;numberTxf.setText(String.valueOf(newNum);publicstaticvoidmain(Stringargs)Incrementori=newIncrementor();i.makeGUI();,if(e.getSource()=incrementBtn),elseif(e.getSource()=decrementBtn),74,选项事件ItemEvent的处理,可触发选项事件的组件有:JCheckBox,JRadioButton,JComboBox注册事件的方法:publicvoidaddItemListener(ItemListenere)处理事件的接口ItemListener,仅含有方法:publicvoiditemStateChanged(ItemEvente),75,例:选项事件ItemEvent的处理例子,用JComboBox和JCheckBox来演示可选项目事件接口,界面如下图所示:,76,importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassItemDemoimplementsItemListenerJFramef;JPanelp1,p2,p3;JLabelbirthPlace,hobby;JComboBoxplace;JCheckBoxhobby1,hobby2,hobby3;publicItemDemo(Stringtitle)f=newJFrame(title);p1=newJPanel();birthPlace=newJLabel(出生地:);place=newJComboBox();place.addItemListener(this);place.addItem(杭州);place.addItem(宁波);place.addItem(温州);place.addItem(绍兴);p1.add(birthPlace);p1.add(place);f.add(p1,North);,77,p2=newJPanel();p2.setLayout(newGridLayout(3,1);hobby=newJLabel(业余爱好:);hobby1=newJCheckBox(运动);hobby1.addItemListener(this);hobby2=newJCheckBox(旅游);hobby2.addItemListener(this);hobby3=newJCheckBox(上网);hobby3.addItemListener(this);p2.add(hobby1);p2.add(hobby2);p2.add(hobby3);p3=newJPanel();p3.add(hobby);p3.add(p2);f.add(p3,Center);f.pack();f.setVisible(true);,78,publicvoiditemStateChanged(ItemEvente)if(e.getSource()=place,79,练习,下列说法哪个是正确的?()A)如果一个组件注册多个监听者,该组件的事件只会被最后一个注册的监听者处理。B)如果一个组件注册多个监听者,该组件的事件将被所有注册的监听者处理。C)一个组件注册多个监听者将导致编译出错。D)一个组件一旦被注册监听器,则无法将该监听者移去。,80,练习,下列说法哪个是正确的?()JFrame,JPanel和JButton等组件都属于容器组件。JButton和JTextField都可用ActionListener接口实现事件处理一个面板(JPanel)不能被加入到另一个面板(JPanel)中在BorderLayout中,添加到NORTH区的两个按钮将并排显示。,81,练习,下面说法错误的是:A、单击JCheckBox(复选框)产生ItemEvent事件,并由ItemListener处理。B、处理JButton和JTextField事件监听器接口都是ActionListener。C、处理鼠标事件的事件监听器接口只有MouseListener。D、在JTextField和JPasswordField中输入数据后按回车(Enter)键会激发一个事件。,82,练习,使用下列哪种布局管理器,使所有的控件在界面上均匀排列?()A)CardLayoutB)FlowLayoutC)BorderLayoutD)GridLayout容器被重新设置大小后,以下哪种布局管理器的容器中的组件大小不随容器大小的变化而改变?()A)CardLayoutB)FlowLayoutC)BorderLayoutD)GridLayout,83,鼠标事件处理,鼠标事件的监听器有鼠标事件监听器(MouseListener)、鼠标移动事件监听器(MouseMotionListener)和鼠标滚轮事件监听器(MouseWheelListener)鼠标事件对应的类是MouseEvent,其中定义了以下一些常量和方法:MOUSE_PRESSED鼠标按下MOUSE_CLICKED鼠标单击MOUSE_RELEASED鼠标松开MOUSE_ENTERED鼠标进入有鼠标事件监听的容器MOUSE_EXITED鼠标离开有鼠标事件监听的容器getX()取得鼠标的X坐标getY()取得鼠标的Y坐标getClickCount()取得鼠标连续单击的次数,84,例13:显示鼠标当前的位置,importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.event.MouseMotionListener;importjava.awt.Graphics;importjava.awt.BorderLayout;importjava.awt.Container;importjavax.swing.JPanel;importjavax.swing.JFrame;classMousePanelextendsJPanelintx_pos,y_pos;MousePanel()addMouseListener(newMouseListener()publicvoidmouseClicked(MouseEvente)publicvoidmouseEntered(MouseEvente)publicvoidmouseExited(MouseEvente)publicvoidmousePressed(MouseEvente)x_pos=e.getX();y_pos=e.getY();repaint();publicvoidmouseReleased(MouseEvente);,85,addMouseMotionListener(newMouseMotionListener()publicvoidmouseMoved(MouseEvente)x_pos=e.getX();y_pos=e.getY();repaint();publicvoidmouseDragged(MouseEvente);protectedvoidpaintComponent(Graphicsg)super.paintComponent(g);g.drawString(当前位置:+x_pos+,+y_pos+,x_pos,y_pos);publicclassMouseDemoextendsJFramepublicMouseDemo()super(鼠标位置);Containerc=getContentPane();c.add(newMousePanel(),BorderLayout.CENTER);publicstaticvoidmain(Stringargs)MouseDemoapp=newMouseDemo();app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(270,150);app.setVisible(true);,86,事件适配器类,Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法;可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。,87,事件接口与适配器类,88,事件接口与方法目录,89,例13代码修改,addMouseListener(newMouseAdapter()publicvoidmousePressed(MouseEvente)x_pos=e.getX();y_pos=e.getY();repain
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论