《Java程序设计》第8周学习总结

201711671215《Java程序设计》第8周学习总结

教材学习内容总结

第9章:组件及事件处理

一、Java Swing概述

通过图形用户界面(GUI),用户和程序之间可以方便地进行交互。

这里用到两个包:Java抽象窗口工具包(AWT),javax.swing包。

Java的组件把类的子类或间接子类创建的对象称为一个组件。

Java把容器的子类或间接子类创建的对象称为一个容器。

容器类提供了添加()方法,容器可以调用这个方法将组件添加到该容器。

容器调用removeAll()方法移掉容器中的全部组件,remove(Component c)方法移掉指定的参数c组件。

容器可以作为组件添加到另一个容器,实现容器的嵌套。

容器添加或移掉组件时,需让容器调用验证()方法,以保证容器中的组件能正确显示。

二、窗口

JFrame的类的实例是一个底层容器,通常称为窗口。

JFrame中有如下方法及常量:

--JFrame(String s)创建标题为s的窗口。

--public void setBounds(int a,int b,int width,int height)设置窗口的初始位置是(a,b),单位像素(px),窗口的宽度,高度。

--public void setLocation(int width,int height)设置窗口大小。

--public void setSize(int x,int y)设置窗口的位置,默认位置(0,0)。

--public void setVisible(boolean b)设置窗口是否可见,窗口默认不可见。

--public void setResizable(boolean b)设置窗口是否可调整大小,默认可调整大小。

--public void dispose()撤销当前窗口,并释放当前窗口所使用的资源。

--public void setExtendState(int state)设置窗口的扩展状态,其中参数state取JFrame类中的下列类常量:MAXIMIZED_HORIZ(水平方向最大化),

MAXIMIZED_VERT(垂直方向最大化),

MAXIMIZED_BOTH(水平,垂直方向都最大化)。

--public void setDeafaultCloseOperation(int operation)该方法用来设置单击窗口右上角的关闭图标都,程序会做出怎样的处理。其中的参数operation可取下列int型static常量:

DO_NOTTHING_ON_CLOSE(什么也不做),

HIDE_ON_CLOSE(隐藏当前窗口),

DISPOSE_ON_CLOSE(隐藏当前窗口,并释放窗体占有的其他资源),

EXIT_ON_CLOSE(结束窗口所在的应用程序)。

三、常用组件及布局

菜单条,菜单,菜单项是窗口常用的组件。

1、创建菜单条:即创建一个JMenuBar的类的实例。

向窗口添加菜单条如下:

setJMenuBar(JMenuBar bar);
注意:只能向一个窗口添加一个菜单条。

2、菜单项:创建一个JMenuItem的类的实例。

同时可以把菜单看做一个菜单项添加到某个菜单中。

3、菜单上的图标:用图标声明一个图标,然后用ImageIcon的类创建一个图标:

Icon icon = new ImageIcon("a.gif");
4、常用组件都是JComponent中的子类:

JTextField(文本框)允许输入单行文本。

JTextArea(文本区)允许输入多行文本。

JButton(按钮)。

JLabel(标签)为用户提供信息。

JCheckBox(复选框)。

JRadioButton(单选按钮)。

JComboBox(下拉列表)。

JPasswordField(密码框)。

5、常用容器

1)JPanel面板,JPanel的面板的默认布局是FlowLayout布局。

2)JTabbedPane选项卡窗格,当用户向JTabbedPane容器添加一个组件时,JTabbedPane容器就会自动为该组件指定一个对应的选项卡。

add(String text,Component c);
public JTabbedPane(int tabPlacement);
3)滚动窗格JScrollPane,滚动窗格只可以添加一个组件。

4)拆分窗格JSplitPane,有水平拆分和垂直拆分两种,拆分线可以移动。

JSplitPane(int a,Component b,Component c);
/*参数a取HORIZONTAL_SPLIT或VERTICAL_SPLIT,决定是水平还是垂直拆分,后两个参数决定要放的组件*/
JSplitPane(int a,boolean b,Component c,Component d);
/*参数a取HORIZONTAL_SPLIT或VERTICAL_SPLIT,决定是水平还是垂直拆分,参数b决定当拆分线移动时,组件是否移动变化,true是连续*/
5)JLayeredPane分层窗格,当组件经常需要处理重叠问题时,可以将组件添加到分层窗格。

6、常用布局

容器可以使用方法

setLayout(布局对象);
设置自己的布局。

1)FlowLayout布局:FlowLayout()该构造方法可以创建一个居中对齐的布局对象,该布局中的组件默认大小为最佳大小,如需改变最佳大小需调用public void setPreferredSize(Dimension preferedSize)如:

button.setPreferredSize(new Dimension(20,20));
2)BorderLayout布局:可以把容器分为东,南,西,北,中五个区域,每个区域只能放一个组件。

3)CardLayout布局:使用该布局的容器可以容纳多个组件,最先加入容器的是第一张(在最上面),依次向下排序,就像叠“扑克牌”,每次只能显示其中一张,被显示的组件将占据所有的容器空间。

4)GridLayout布局:把容器划分为若干行乘若干列的网格区域,最多可添加m×n个组件,该布局中每个网格都是相同大小并且强制组件与网格的大小相同。

5)null布局:空布局容器可以准确地定位组件在容器中的位置和大小。

6)BoxLayout布局:利用容器嵌套,可以在某个容器嵌入几个盒式容器,达到布局目的。

四、处理事件

1、事件源:能够产生事件的对象。

     监视器:需要一个对象对事件源进行监视,以便对发生的事件作出处理。

     处理事件的接口:为了让监视器这个对象能对事件源发生的事进行处理,创建该监视器对象的类必须声明实现相应的接口。

2、ActionEvent事件源:文本框,按钮,菜单项,密码框,和单选框都可以触发的ActionEvent事件。

     注册监视器:该事件的组件使用方法addActionListener(ActionListener listen)将实现ActionListener接口的类的实例注册为事件源的监视器。

     ActionListener接口在java.awt.event包中,该接口只有一个方法public void actionPerformed(ActionEvent e)。

     ActionEvent类中的方法,常用的有:

1)public Object getSource()该方法是从Event继承的方法,ActionEvent事件对象调用该方法可以获取发生ActionEvent事件的事件源对象的引用。

2)public String getActionCommand()   ActionEvent对象调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个“命令”字符串,对于文本框,当发生ActionEvent事件时,默认“命令”字符串是文本框中的文本。

3、ItemEvent事件:选择框,下拉列表都可以出发一个ItemEvent事件。

     使用addItemListener(ItemListener listen)将实现ItemListener接口的类的实例注册为事件源的监视器。

     ItemListener接口在java.awt.event包中,该接口中只有一个方法public void itemStateChanged(ItemEvent e)。

4、DocumentEvent事件:用户在文本区中的数据发生变化,从而导致文本区中的文本内容发生变化,将导致文本区所维护的文档模型中的数据发生变化,这是文档出发的DocumentEvent事件。

     使用addDocumentListener(DocumentListener listen)将实现DocumentListener接口的类的实例注册为事件源的监视器。

     DocumentEvent接口有3个方法:

public void changedUpdate(DocumentEvent e)
public void removeUpdate(DocumentEvent e)
public void insertUpdate(DocumentEvent e)
5、MouseEvent事件:任何组件都可以发生鼠标事件,注册监视器的方法是addMouseListener(MouseListener listener)。

1)使用MouseListener接口可以处理以下5种操作触发的鼠标事件:

事件源上按下鼠标键;在事件源上释放鼠标键;在事件源上单击鼠标键;鼠标进入事件源;鼠标退出事件源。

     MouseEvent类中有下列几个重要的方法:

getX()获取鼠标在事件源坐标系中的x坐标。

getY()获取鼠标在事件源坐标系中的y坐标。

getModifiers()获取鼠标的左键或右键。左键和右键分别用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK表示。

getClickCount()获取鼠标被点击的次数。

getSource()获取发生鼠标事件的事件源。

2)使用MouseMotionListener接口处理鼠标事件:

在事件源上拖动鼠标;在事件源上移动鼠标。

     事件源注册监视器的方法是addMouseMotionListener(MouseMotionListener listener)。

     MouseMotionListener接口中有如下方法:

mouseDragged(MouseEvent)当你拖动鼠标时(不必在事件源上),监视器调用接口中的这​​个方法对事件做出处理。

mouseMoved(MouseEvent)当你在事件源上移动鼠标时,监视器调用接口中的这​​个方法对事件做出处理。

五、后续的时间处理及GUI组件

1、焦点事件:组件可以通过addFocusListener(FocusListener listener)注册焦点事件监视器。创建监视器的类必须要实现FocusListener接口,该接口有两个方法:

public void focusGained(FocusEvent e); //当组件从无输入焦点变成有输入焦点触发该事件

public void focusLost(FocusEvent e); //当组件从有输入焦点变成无输入焦点触发该事件
用户通过单击组件可以使得该组件有输入焦点,同时也使得其他组件变成无输入焦点。一个组件也可调用public boolean requestFocusInWindow()方法可以获得输入焦点。

2、键盘事件:按下、释放或敲击键盘上一个键时就触发了键盘事件,使用addKeyListener(KeyListener listener)方法注册监视器。使用KeyListener接口处理键盘事件,该接口包括如下3个方法:

public void KeyPressed(KeyEvent e); //用户按下键盘上的某个键时,监视器调用该方法

public void KeyTyped(KeyEvent e); //当键被按下又被释放时,监视器调用该方法

public void KeyReleased(KeyEvent e); //用户释放键盘上按下的键时,监视器调用该方法
public int getKeyCode()方法可以判断哪个键被按下,敲击或释放。

3、窗口事件:凡是Window子类创建的对象都可以发生WindowEvent事件。

     WindowListener接口:当一个窗口被激活、撤销激活、打开、关闭、图标化或撤销图标化时,就触发了窗口事件。

     窗口使用addWindowListener(WindowListener listener)方法获得监视器。

     创建监视器对象类必须实现WindowListener接口,该接口有7个不同的方法:

public void windowActivated(WindowEvenr e)当窗口从非激活状态到激活状态时,窗口监视器调用该方法。

public void windowDeactivated(WindowEvent e)当窗口从激活状态到非激活状态时,窗口监视器调用该方法。

public void windowClosing(WindowEvent e)当窗口正在被关闭时,窗口的监视器调用该方法。

public void windowClosed(WindowEvent e)当窗口关闭后,窗口的监视器调用该方法。

public void winndowIconified(WindowEvent e)当窗口图标化时,窗口的监视器调用该方法。

public void windowDeiconefied(WindowEvent e)当窗口撤销图标化时,窗口的监视器调用该方法。

public void windowOpened(WindowEvent e)当窗口打开时,窗口的监视器调用该方法。

注:当单击窗口右上角的关闭图标时,监视器首先调用windowClosing方法,如果在方法中使用

System.exit(0);
退出程序的运行,那么监视器就没有机会再调用windowClosed方法。

     WindowAdapter适配器:当Java提供处理事件的接口多于一个方法时,Java相应地就提供一个适配器类,比如WindowAdapter类。适配器已经实现了相应的接口,因此可以使用WindowAdapter的子类创建的对象做监视器,在子类中重写所需要的接口方法即可。

4、匿名类实例或窗口做监视器:

(1)匿名类的实例做监视器:当事件的处理比较简单,系统也不复杂时,使用匿名类或内部类做监视器是一个不错的选择。(2)窗口做监视器:当事件的处理比较简单,系统也不复杂时,让窗口作为监视器是一个不错的选择;让组件所在的窗口作为监视器,能让事件的处理比较方便。

5、事件总结:

授权模式:Java的事件处理是基于授权模式,即事件源调用方法将某个对象注册为自己的监视器。

接口回调:Java语言使用接口回调技术实现处理事件的过程,用addXXXListener(XXXListener listener)方法将某个对象注册为自己的监控器,方法中的参数是一个接口,listener可以引用任何实现了该接口的类所创建的对象,当事件源发生事件时,接口听众立刻回调被类实现的接口中的某个方法。

方法绑定:Java运行系统要求监视器必须绑定某些方法来处理事件,即将某种事件的处理绑定到对应的接口,也就是说,当事件源触发事件发生后,监视器准确知道去调用哪个方法(自动去调用的)。

保持松耦合:监视器和事件源应当保持一种松耦合关系,尽量让事件源所在的类和监视器是组合关系;当事件源触发事件发生后,系统知道某个方法会被执行,但无须关心到底是哪个对象去调用了这个方法。

6、MVC结构:模型-视图-控制器,简称MVC。MVC首先出现在Smalltalk编程语言中。

MVC是一种通过3个不同部分构造一个软件或组件的理想方法:

模型用于存储数据的对象。

视图为模型提供数据显示的对象。

控制器处理用户的交互操作,对于用户的操作做出响应,让模型和视图进行必要的交互,即通过视图修改,获取模型中的数据;当模型中的数据变化时,让视图更新显示。

从面向对象的角度看,可以将某个对象看作“模型”,然后为“模型”提供恰当的组件,即“视图”。为了对用户的操作做出响应,可以选择某个组件做“控制器“,当触发事件时,通过'视图'修改或得到'模型'中维护着的数据,并让'视图'更新显示。

对话框:如果一个有模式的对话框处于激活状态,则将堵塞其他线程的执行,此时用户不能再激活对话框所在程序的其他窗口直至该对话框消失不见;如果一个无模式的对话框处于激活状态,能再激活其他窗口,也不阻塞其他线程的执行。

注:进行一个重要的操作动作之前,通过弹出一个有模式的对话框表明操作的重要性。

(1)消息对话框:有模式对话框。

public static void showMessageDialog(Component parentComponenet,//指定对话框可见时的位置
                                        String message,//指定对话框上显示的消息
                                        String title,//知道对话框的标题
                                        int messageType)  //取值是JOptionPane中的类常量:
//INFORMATION_MESSAGE;WARNING_MESSAGE;ERROR_MESSAGE;QUESTION_MESSAGE;PLAIN_MESSAGE
取值JOptionPane.WARNING_MESSAGE时,对话框的外观上会有明显的符号“!”。

(2)输入对话框:该对话框含有汞用户输入文本的文本框,一个确认和取消按钮,是有模式的对话框。

public static void main(Component parentComponent,//指定输入对话框所依赖的组件
                            Object message,//指定对话框上的提示信息
                            String title,//指定对话框上的标题
                            int messageType)//可取的JOptionPane中的类常量与消息对话框的相同
单击输入对话框上的确定按钮,取消按钮或关闭图标,都可以使输入对话框消失不可见;如果单击的是确认按钮,输入对话框返回用户在对话框的文本中输入的字符串,否则返回NULL。

(3)确认对话框:有模式的对话框,的JOptionPane的类的静态方法:

public static int showConfirmDialog(Component parentComponent,Object message,String title,int optionType)
optionType可取的有效值是的的JOptionPane中的类常量:YES_NO_OPTION,YES_NO_CANCEL_OPTION,OK_CANCEL_OPTION。

在取值JOptionPane.YES_NO_OPTION时,确认对话框的外观上会有是和否两个按钮,当确认对话框消失后,showConfirmDialog的的方法会返回下列整数值之一:JOptionPane.YES_OPTION,JOptionPane.NO_OPTION,JOptionPane的的.CANCEL_OPTION,JOptionPane.OK_OPTION,JOptionPane.CLOSED_OPTION。返回的具体值依赖用户所单击的对话框上的按钮和对话框上的关闭图标。

(4)颜色对话框:有模式的对话框; javax.swing中的中包中的供JColorChooser的类的静态方法:

public static Color showDialog(Component component,//参数指定的组件的正前方显示,如果component为null,颜色对话框在屏幕的正前方显示
String title,
Color initalColor)//指定颜色对话框返回的初始颜色
(5)自定义对话框:与创建窗口类似,通过建立的的JDialog的子类来建立一个对话框类,然后这个类的一个实例就是对话框,对话框是一个容器,默认布局为BorderLayout的的,对话框可以添加组件,实现与用户的交互操作。

的JDialog()构造一个无标题的初始不可见的对话框,对话框依赖一个默认的不可见窗口,该窗口由Java运行环境提供。

的JDialog(JFrame的所有者)构造一个无标题的初始不可见的无模式的对话框,所有者取对空,对话框依赖一个默认的不可见窗口,该窗口由爪哇运行环境提供。

7、树组件与表格组件:

(1)树组件:JTree的的类的对象称为树组件,也是常用组件之一。

DefaultMutableTreeNode结点:任何实现MutableTreeNode接口的类创建的对象都可以成为树上的结点。

DefaultMutableTreeNode类两个常用的构造方法是:

DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode(Object userObject,boolean allowChildren)
树上的TreeSelectionEvent事件:使用addTreeSelectionListener(TreeSelectionListener listener)方法获得一个监视器。

(2)表格组件:以行和列的形式显示数据,允许对表格中的数据进行编辑表格的模型功能强大,灵活并易于执行由于表格是最复杂的组件,我们目前只介绍默认的表格模型。

JTable中有7个构造方法,此处介绍常用的3个:

JTable的()创建默认的表格模型;

JTable(int a,int b)创建行,b列的默认模型表格;

JTable(Obkect data [] [],Object columnName [])创建默认表格模型对象,并且显示由data指定的二维数组的值,其列名由数组columnName指定。

当表格需要刷新显示时,让表格调用repaint方法。

8、按钮绑定到键盘:用户直接敲击某个键代替用鼠标单击巨头按钮所产生的效果。

AbstractAction类与特殊的监视器:要求创建监视器的类必须实现的ActionListener接口的子接口动作。

如果按钮通过addActionListener方法,()方法注册的监视器和程序为按钮的键盘操作指定的监视器是同一个监视器,那么就可以代替用鼠标单击该按钮所产生的效果;

编写AbstractAction类的子类时,只要重写public void actionPerform(ActionEvent e)方法即可。

指定监视器的步骤:获取输入映射,绑定按钮的键盘操作,为按钮的键盘操作指定监视器。

注意事项:为按钮的键盘操作指定的监视器和按钮本身是有addActionLister方法注册的监视器可以不是相同的一个,甚至按钮可以不使用addActionLister方法注册任何监视器比如,如果想刚如敲击键盘就移动按钮,可以不为按钮注册监视器,即删除程序中的

button.addActionListener(listener)
那么,程序用鼠标单击按钮不能移动按钮。

9、打印组件:应用程序可以使用的PrintJob对象完成打印组件的工作,步骤如下:

(1)获取工具包对象:让组件调用的的getToolkit()方法返回系统提供的工具包对象。

(2)获得的PrintJob的对象:工具包对象调用getPrintJob()方法返回一个的PrintJob的对象。

(3)获取的图形对象:PrintJob的的对象使用的的getGraphics()方法获得一个图形对象。

(4)打印组件:假设步骤3 获得的图形对象为g,那么组件调用方法paintAll(g)将打印出该组件及其子组件。paint(g)打印该组件本身的形状,不打印组件上的其他信息。

10、发布GUI程序:可以使用jar.exe的的把一些文件压缩成一个JAR文件,来发布GUI应用程序。

生成一个JAR文件的步骤如下:

首先用文本编辑器编写一个清单文件,扩展名为即.mf,如Mymoon.mf;

接着是生成JAR文件,如果目录测试下的字节码文件刚好是应用程序需要的全部字节码文件,也可以如下生成JAR文件:

D:\ test \ jarcfm Tom.jar Mymoon.mf * .class。

可以将Tom.jar文件复制到任何一个安装了Java的的运行环境的计算机上,只要用鼠标双击该文件结可以运行该的Java的应用程序了。

教材学习中的问题和解决过程

无。

代码调试中的问题和解决过程

无。

感悟

看书敲代码吧。

猜你喜欢

转载自blog.csdn.net/ab111996/article/details/84922960
今日推荐