您的位置:首页 > 编程语言 > Java开发

Java核心技术(卷I)读书笔记 第七~九章

2017-09-27 17:55 204 查看

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):为容器设置布局管
e2d6
理器

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();
将文件视图安装到文件选择器中。

颜色选择器:JColorChooser, 是一个组件,而不是一个对话框。

Color selectedColor = JColorChooser.showDialog(parent, title, initialColor);


也可以设置一个无模式的颜色选择器对话框,需要提供:父组件,对话框标题,选择选择模式,颜色选择器,OK和Cancel按钮对话框。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 读书笔记