Java核心技术(卷I)读书笔记 第七~九章
来源:互联网 发布:淘宝网上的女装 编辑:程序博客网 时间:2024/04/28 18:16
Java核心技术(卷I)读书笔记 第七~九章
GUI
Chapter 7 图形程序设计
- Swing概述:抽象窗口工具箱( Abstract Windoe Toolkit ) AWT. Swing已经是Java基础类库( Java Foundamental Class JFC) 的一部分了。Swing类位于 javax.swing包中,javax表示这是一个Java扩展包。所有的Swing组件都由事件分配线程(event dispatch thread)进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
- 框架Frame:在Java中顶层窗口被称为框架。默认情况下,框架的大小为 0*0,框架起初是不可见的,调用 setVisible(true)。JFrame类继承了许多用于处理框架大小和位置的方法:
- setLocation(int x, int y),setBounds(int x, int y, int width, int height):用于设置框架的位置。
- SetIconImage(Image image)用于告诉窗口系统在标题栏、任务切换窗口等位置显示那个图标。
- setTitle(String name):用于改变标题栏的文字。
- setResizable(boolean b):利用boolean
- 值确定框架的大小是否允许用户改变。
确定合适的框架的大小:
Toolkit kit = Toolkit.getDefaultToolkit(); //调用Toolkit类的静态方法返回一个Toolkit对象//Dimension screenSize = kit.getScreenSize();//getScreenSize以Dimension对象的方式返回屏幕的大小int screenWidth = screenSize.width;int screenHeight = screenSize.height;
组件:绘制一个组件,需要定义一个扩展JComponent的类,并覆盖其中的paintComponent方法。其中有一个Graphics类型的参数,在Java中所有的绘制都必须使用Graphics对象,包含了绘制图案、图像和文本的方法。只要窗口需要重新绘图,事件处理器就会通告组件,从而引发执行所有组件的paintComponent方法,所以一定不要自己调用paintComponent方法。
显示文本是一种特殊的绘图,在Graphics有一个drawString方法,g.drawString(text, x, y);
覆盖getPreferredSize()方法,返回一个有首选项宽度和高度的Dimension类对象,告诉用户组件有多大。
当框架中填入一个或多个组件时,如果只想使用它们的首选大小,就可以调用pack()方法。
使用frame.add(Component C):将给定的组件添加到给框架的内容窗格中。- 处理2D图形:要想绘制图形,首先要创建一个实现了Shape接口类的对象,然后调用Graphics2D类的draw方法。
使用颜色:可以使用Graphics2D类的setPaint(Paint p)方法可以为图形环境上的所有后续绘制操作选择颜色。`g.setPaint(Color.RED);
只需要将draw替换为fill(Shape S) 就可以用一种颜色填充一个封闭图形。
Color类用于定义颜色,在java.awt.Color类中提供了13个预定义的常量,分别表示13中标准颜色。可以使用 0~255之间的红绿蓝三种颜色来创建一个Color对象。
可以使用Component的setBackground(Color c)设置背景颜色。
Java在 SystemColor 中预定义了很多颜色的名字,其中的常量封装了用户系统的各个元素的颜色。 - 特殊字体:人们可以通过字体名( font face name) 指定一种字体,字体名由字体家族名(font family name) 和 一个可选的 “Bold”后缀组成。
- 要想使用某种字体绘制字符,必须首先利用制定的字体名、字体风格和字体大小来创建一个Font类对象。
Font sansbold14 = new Font("SansSerif", Font.BOLD, 14);
其中字体的风格有Font.PLAIN, Font.BOLD, Font.ITALIC。
可以使用deriveFont(Float f)方法得到希望的字体大小。
有关包围字符串的矩形:基线( baseline )是一条虚构的线,上坡度( ascent )是从基线到坡顶( ascenter )的距离,下坡度( decenter )是从基线到破敌( descenter )的距离。行间距( leading )
是某一行的坡底到其下一行的坡顶的距离,字体的高度是连续两个基线的距离。 - 显示图像:可以是哦用ImageIcon类
Image image = new ImageIcon(filename).getImage();
Chapter 8 事件处理
- 事件过程 event procedure:程序员将相应的特定事件编写代码,并将这些代码放置在过程中。事件源 event source,事件监听器 event listener。监听器对象是实现了特定监听器接口的类的实例,监听器必须有一个被称为actionPerformed的方法,接收一个actionEvent参数。事件源是一个能够注册监听器对象并发送事件对象的对象。
- 动态改变观感:调用静态UIManager.setLookAndFeel方法,并提供所想要的观感类名,然后再调用SwingUtilities.updateComponentTreeUI刷新全部的组件集。
- 适配器类:窗口佳宁器必须是实现WindowListener接口的类的一个对象。
- Action接口:用来封装命令,将他们连接到多个事件源上。
- void actionPerformed(ActionListener event):Action扩展语ActionListener接口。
- void setEnabled(boolean b)
- boolean isEnabled(): 这两个方法允许启用或者禁用这个动作,并检查这个动作时候当前可用。
- putValue, getValue:这两个方法允许存储和检索动作对象中的任意值/名。其中Action.NAME 和 Action.SAMLL_ICON 将动作的名字和图标存储到一个动作对象中。如果将动作对象添加到菜单或者工具栏中,它的名称和图标就会自动被提取出来。
Aciton.putValue(Action.NAME, "Blue");
Action.putValue(Action.SAMLL_ICON, new ImageIcon("blue-ball.gif"));
- addPropertyChangeListener, removePropertyChangeListener:这两个方法能让其他对象在动作对象的属性发生 变化时得到通知。
有一个类实现了除ActionListener外的所有接口,叫做AbstractAction。
- 将动作和击键关联起来要生成KeyStroke对象,可以条用KeyStroke类的静态getKeyStroke方法。
KeyStroke ctrlBKey = keyStroke.getKeyStroke("ctrl B");
- KeyBoard Focus:当用户敲击键盘时,这个动作就会被发送给拥有焦点的组件。通常具有焦点的组件就会明显感受到。每个JComponent有三个输入映射,每个映射的KeyStroke对象都与动作关联。
- WHEN_FOCUSED:当这个组件拥有键盘焦点
- WHEN_ANCESTOR_OF_FOCUSED_COMPONENT:当这个组件包含了拥有焦点的组件。
- WHEN_IN_FOCUSED_WINDOW:当这个组件被包含在拥有焦点的窗口中。
按键处理将按照从上到下的顺序进行,可以使用InputMap从组建中获得输入映射。InputMap imap = new InpurMap(Action.WHEN_FOCUSED);
InputMap先将KeyStroke对象映射到任意对象上,然后由ActionMap类实现将对象映射到动作的第二个映射。imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
ActionMap amap = panel.getActionMap();
amap.put("panel.yellow", yellowAction);
习惯上使用字符串none表示空动作,用来去下一个按键动作。imap.put(KeyStroke.getKeyStroke("ctrl Y"), "none");
接下来将这个动作和按键关联起来,JButton有用Action作为参数的构造器JButton blueButton = new JButton(yellowButton);
- 鼠标事件:当用户点击鼠标时,就会调用三个监听器参数:鼠标第一次被调用时调用mousePressed, 鼠标被释放时调用mouseReleased, 最后调用mouseClicked。
当鼠标移动时,有两个独立接口MouseListener 用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口 和 MouseMotionLIstener接收鼠标移动事件的抽象适配器类。
只有鼠标在一个组件内部停留时才会调用mouseMoved方法,即使鼠标拖动到组件外面,mouseDragged
方法也会被调用。另外,mouseEntered和mouseExited这两个方法是在鼠标进入或移出组件时被调用。 - AWT事件继承层次:事件对象封装了事件源和监听器彼此通信的时间信息。AWT将事件分为低级( low-level )和语义( semantic )事件。语义时间表示用户动作的事件,低级事件是形成那些事件的事件。
常用的5个低级事件是:KeyEvent、MouseEvent、MouseWheelEvent、FocusEvent和WindowEvent。
Chapter 9 Swing用户界面组件
- 模型-视图-控制器:设计模式。
- 流布局管理器(flow layout mananger):是面板默认的布局管理器。
- SetLayout(Layout Manager):为容器设置布局管理器
- add(Component C):将组件添加到容器中并返回其引用。
- FlowLayout(int align, int hgap, int vgap):构建一个系的FlowLayout对象,设置对齐,水平和垂直间距。
- 边框布局管理器(border layout manager):是JFrame内容窗格的默认布局管理器。当容器被缩放时,边缘组件的尺寸不会改变,而中间组建的大小会变化。添加组件时可以指定BorderLayout类中的CENTER、NORTH、SOUTH、EAST和WEST常量,默认为CENTER。
边框布局会拓展所偶有的尺寸以填满可用空间。 - 网格布局(GridLayout):在网格布局对象的构造器中需要指定行数和列数
panel.setLayout(new GridLayout(4, 4));
- 文本输入:文本域(JTextField)只能接收单行的文本输入,文本区(JTextArea)能够接收多行的文本输入。JPassword也只能接收单行文本输入,但不会将输入内容显示出来。
JTextField textField = new JTextFirld("Default Input", 20);
panel.add(textField);
不提供字符串参数文本域就是空白。在示例中宽度之为20列,一列就是在当前使用的字体下一个字符的宽度。应将最大输入长度设为在多设置1~2个字符。可使用textField.setColumns(5); panel.revalidate();
在运行时重新设置列数。revalidate()方法重新计算容器内所有组件大小并对他们重新布局。textField.getText().trim();
将返回的文本域的前后空格去掉。textArea.setLineWrap(true);
开启换行特性避免裁剪过长的行。 - 标签:标签是容纳文本框的组件,没有任何修饰符,也不响应用户输入。可以利用标签标示组件:
- 用相应的文本构造一个JLAbel组件。
- 将标签组件放置在距离需要标识的组件的足够近的地方。
构造器可以指定初始文本和图标,也可以选择内容排列方式——用SwingConstants接口中几个常量。JLabel label = new Label("User name: ", SwingConstants.RIGHT);
- 密码域:每个输入的字符都是用回显字符(echo character)显示出来,JPasswordField类实现了这样的功能。
setEchoChar(char echo)为密码域设置回显字符。 - 滚动窗格:在Swing中,文本区没有滚动条,需要将文本区插入到滚动窗格(scroll pane)中。
JScrollPane scrollPane = new JScrollPane(textArea)
- 选择组件:复选框:复选框需要紧邻的标签来说明其用途
JCheckBox bold = new JCheckBox("Bold");
使用setSelect方法来选定或取消复选框bold.setSelect(true);
isSelected方法返回每个复选框当前的状态。 - 单选按钮(Radio Button Group):为按钮组构造ButtonGroup对象,然后再将JRadioButton类型的对象加入到按钮组中。仍需要进行布局。
JRadioButton smallButton = new JRadioButton("Small", true);
第二个参数表明这个按钮初始状态是否被选择。 - 边框(borders):可以在任何继承了JComponent的组件上应用边框,最常用的用途是在一个面板周围防止一个边框,然后用其他洪湖街面元素填充边框。方法
- 调用BorderFactory静态方法创建边框:凹斜面、凸斜面、蚀刻、直线和蒙刻。
- 可以给边框添加标题,将边框传递给BorderFactory.createTitledBorder。
- 调用BorderFactory.createCompoundBorder将边框组合起来使用。
- 调用JComponent类中的setBorder方法将结果添加到组建中。
Border etched = BorderFactory.createEcthedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "A Title");
panel.setBorder(etched);
- 组合框( Combo Box ):JComboBox类提供了组合框的组件。调用setEditable方法让组合框可编辑。在JAva SE 7中,这个类是泛型类。调用getSelectedItem方法获取当前的选项,如果组合框是可编辑的,那么当前选项也是可编辑的。
JComboBox<String> facoCombo = new JComboBox<>();
faceCombo.addItem("Serif");
这个方法将字符串添加到列表的尾部。faceCombo.insertItemAt("Monospaced", 0);
faceCombo.removeItem("Serif")
faceCombo.removeItemAt(0)
faceCombo.removeAllItems()
用于移除选项。
如果需要向组合框中添加大量选项,构造一个DefaultComboBoxModel,并调用addElement进行加载。然后再调用setModel方法。
用户从组合框中选择一个选项时,组合框就产生一个动作事件,调用getSource方法得到发送事件的组合框引用,接着调用getSelectedItem方法获取当前选项。 - 滑动条:允许进行连续值的选择。
JSlider slider = new JSlider(min, max, InitialValue);
默认值为0, 100, 50。
如果使用垂直滑动条:JSlider slider = new JSlider(SwingConstants.VERTICAL, min, max, InitialValue);
当滑动条的值发生改变时,ChangeEvent就会发送给所有变化的监听器,为了得到这些改变的通知,就要调用addChangeListener方法并且安装了一个实现了ChangeListener接口的对象。public void stateChange(ChangeEvent event){
JSlider slider = (JSlider)event.getSource();
int value = slider.getValue();
}
可以使用标尺(tick)对滑动条进行修饰。slider.setMajorTickSpacing(20)
每20单位显示一个大标尺。slider.setMinTickSpacing(5)
每5个单位显示一个小标尺。
可以强制滑动条对其标尺slider.setSnapToTicks(true);
可以使用slider.setPaintLabels(true)
为大标尺添加标尺标记标签(tick mark labels).
要想要隐藏滑动条移动的轨迹可以调用slider.setPaintTrack(false);
逆向滑动条slider.setInverted(true);
- 菜单:菜单栏(menu bar), 菜单项(menu items)和子菜单(submenu)。
首先创建一个菜单栏,可以添加到任何位置,通常放在菜单顶部。JMenuBar menuBar = new JMenuBar();
frame.setMenuBar(menuBar);
将菜单添加到框架上
为每一个菜单建立一个菜单对象JMenu editMenu = new JMenu("Edit");
将顶层菜单加到菜单栏中menuBar.add(editMenu);
向菜单中添加菜单项、分隔符和子菜单JMenuItem pasteItem = new JMenuItem("Paste");
editMenu.add(pasteItem);
editMenu.setSeparator();
JMenu optionMenu = new ...;
editMenu.add(optionMenu);
可以使用JMenu.add(String s)
方法将菜单插入到菜单尾部。
当用户选择菜单时,会触发一个动作事件。需要为每一个菜单安装动作监听器。
将动作处理器添加到菜单项JMenuItem exitItem = fileMenu.add(exitAction);
可利用JMenuItem(String, Icon)
或setIcon方法指定图标。
可以将一个图标添加到一个动作上,或者利用AbstractAction构造器社遏制图标。
为菜单项创建复选框。当用户选择一个菜单项时,菜单项就会自动在选择与未选择之间进行切换。JCheckBoxMenuItem readonlyItem = new JCheckBoxMenuItem("Read-only");
optionMenu.add(readonlyItem);
为菜单项添加单选按钮,必须把它们加入按钮组中。ButtonGroup group = new ButtonGroup();
JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");
insertItem.setSelected(true);
group.add(InsertItem);
optionsMenu.add(InsertItem);
弹出菜单(pop-up menu):
创建一个弹出菜单与一般菜单类似,但是没有标题。JPopupMenu popup = new JPopupMenu();
用常规方法添加菜单项。
要调用show方法才能显示菜单,须给出父组件和相对父组件的显示位置。popup.show(panel, x, y);
当用户点击某个鼠标键时弹出菜单,这就是所谓弹出式触发器(pop-up trigger )在Windows中,弹出式触发器是鼠标右键。component.setComponentPopyoMenu(popup);
快捷键和加速器
通过在菜单项的构造器中制定一个快捷字母来为菜单项设置快捷键。快捷键会自动显示在菜单项中,并带有一条下划线。JMenuItem aboutItem = new JMenuItem("About", "A");
如果有Action对象,就可以把快捷键作为Action.MNEMONIC_KEY的键值添加到对象中。cutAction.putValue(Action.MNEMONIC_KEY, new Integer('A'));
如果想为菜单设置快捷键,就要调用setMnemonic()方法。helpMenu.setMnemonic('H');
加速器是在不打开菜单的情况下选择菜单项的快捷键。使用setAccelerator()方法将一个加速器关联到一个菜单项上。加速器只能关联到菜单项上,将直接激活菜单关联的动作事件。openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));
启用和禁用菜单项:
启用或禁用菜单项需要调用setEnable(boolean b)方法
在显示菜单前禁用这些菜单项,需要为”menu selected”事件注册监听器,swing包中定义了MenuListener接口。 - 工具栏:是提供快捷访问的按钮栏。可以将其任意移动,可以完全脱离框架。
JToolBar bar = new JToolBar();
bar.add(blueButton);
添加按钮bar.add(blueAction);
以动作对象作为参数bar.setsetSeparator();
设置分隔符bar = new JToolBar(titleString);
工具栏没有停靠时,可设置标题bar = new JToolBar(SwingConstants.VERTICAL);
将工具栏数值显式
工具提示(tooltips)
在Swing中可以使用button.setToolTipsText("Exit");
或者使用Action对象button.putValue(Action.SHORT_DESCRIPTION, "Exit");
对话框:AWT分为模式对话框(在结束对它的处理之前不允许与应用程序的其余窗口进行交互)和无模式对话框(允许用户在对话框的应用程序的其他窗口输入信息)。
文件对话框
- 建立一个JFileChooser 对象,不需要制定父组件,允许在多个框架中重用一个文件选择器。
JFileChooser chooser = new JFileChooser();
- 调用setCurrentDirectory方法设置当前目录。
chooser.setCurrentDirectory(new File("."));
- 如果有一个想要用户作为的默认文件名,调用setSelectedFile()
chooser.setSelectedDirectory(new File(filename));
- 如果允许用户在对话框选择多个文件,需要调用setMultiSelectionEnabled()方法。
chooser.setMultiSelectionEnabled(true);
- 如果想让对话框仅显示一种类型的文件(.gif等),需要设置文件过滤器。
- 默认情况下,用户在文件选择器只能选择文件,如果想要选择目录,需要调用
setSelectionMode
方法,参数值为JFileChooser.Files_ONLY, JFileChooser.DIRECTORIES_ONLY, JFileChooser.FILES_AND_DIRECTORYIES - 调用showOpenDialog或者showDaveDialog方法显示对话框。必须为这些方法调用父组件。
int result = chooser.showOpenDialog(parent);
int result = chooser.showSaveDialog(parent);
这些调用的区别在于”确认按钮不同”,点击确认按钮将完成文件选择,调用showDialog方法,将一个显示地文本传递给确认按钮int result = chooser.showDialog("Select");
只用当哟用户确认、取消或者离开对话框的时才返回调用。 - 调用getSelectFile()或getSelectFiles()方法获取用户选择的一个或者多个文件,调用getPath方法获取文件名。
String filename = chooser.getSelectFile().getPath();
若想要限制显示地文件,需要创建一个实现了抽象类javax.Swing.filechooser.FileFliter的对象,文件选择器将文件传递给文件过滤器,只有文件过滤器接受的文件才会被显示出来。chooser.setFileFliter(fliter1);
当然可以为一个文件安装多个过滤器。chooser.resetFileFliters();
清除旧的文件过滤器。 - 为每个文件选择器显示的没个文件提供特定的图标和文件,需要扩展于javax.Swing.filechooser包中的FileView类的对象。
然后调用chooser.setFileView();
将文件视图安装到文件选择器中。
- 建立一个JFileChooser 对象,不需要制定父组件,允许在多个框架中重用一个文件选择器。
颜色选择器:JColorChooser, 是一个组件,而不是一个对话框。
Color selectedColor = JColorChooser.showDialog(parent, title, initialColor);
也可以设置一个无模式的颜色选择器对话框,需要提供:父组件,对话框标题,选择选择模式,颜色选择器,OK和Cancel按钮对话框。
阅读全文
0 0
- Java核心技术(卷I)读书笔记 第七~九章
- Java核心技术 ( 卷 I ) 读书笔记(第一~三章)
- Java核心技术(卷I)读书笔记 第四~六章
- 读书笔记-《Java核心技术卷I-基础知识》
- Java核心技术 卷I 手记(一)
- Java核心技术 卷I 手记(二)
- 《Java 核心技术卷一》读书笔记
- java 核心技术卷1读书笔记
- java核心技术卷一 读书笔记
- Java核心技术卷I知识点
- Java异常(Java核心技术卷一读书笔记)
- [原]《Java2核心技术 卷I:基础知识》(原书第七版) 例6-4 InnerClassTest.java 勘误
- 《Java核心技术 卷I》笔记 第二章 Java程序设计环境
- 《Java 2核心技术卷一》(读书笔记一)
- 《Java核心技术(卷一)》读书笔记——接口
- java核心技术卷I-第三章学习笔记
- java核心技术卷I-第四章学习笔记
- java核心技术卷I-第六章学习笔记
- python+selenium
- 需求推送变革!陈小平教授深度剖析机器人因何由精确性转向灵巧性
- python里使用map()函数
- ssh: connect to host master port 22: Connection refused
- numpy巩固
- Java核心技术(卷I)读书笔记 第七~九章
- Jfinal整合EhCache
- 用Javascript获取页面元素的具体位置
- Splay模板(序列终结者)
- eclipse 中编译cocos2dx 代码,报错:DescriptionResourcePath LocationType *** Android NDK: Aborting. . S
- ES6 数组扩展
- 几个有用的bat脚本
- springboot与mybatis的完美融合
- android listview与父布局相互滑动