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

来源:互联网 发布:淘宝网上的女装 编辑:程序博客网 时间:2024/04/28 18:16

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

GUI

Chapter 7 图形程序设计

  1. Swing概述:抽象窗口工具箱( Abstract Windoe Toolkit ) AWT. Swing已经是Java基础类库( Java Foundamental Class JFC) 的一部分了。Swing类位于 javax.swing包中,javax表示这是一个Java扩展包。所有的Swing组件都由事件分配线程(event dispatch thread)进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
  2. 框架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
    • 值确定框架的大小是否允许用户改变。
  3. 确定合适的框架的大小:

    Toolkit kit = Toolkit.getDefaultToolkit(); //调用Toolkit类的静态方法返回一个Toolkit对象//Dimension screenSize = kit.getScreenSize();//getScreenSize以Dimension对象的方式返回屏幕的大小int screenWidth = screenSize.width;int screenHeight = screenSize.height;
  4. 组件:绘制一个组件,需要定义一个扩展JComponent的类,并覆盖其中的paintComponent方法。其中有一个Graphics类型的参数,在Java中所有的绘制都必须使用Graphics对象,包含了绘制图案、图像和文本的方法。只要窗口需要重新绘图,事件处理器就会通告组件,从而引发执行所有组件的paintComponent方法,所以一定不要自己调用paintComponent方法
    显示文本是一种特殊的绘图,在Graphics有一个drawString方法,g.drawString(text, x, y);
    覆盖getPreferredSize()方法,返回一个有首选项宽度和高度的Dimension类对象,告诉用户组件有多大。
    当框架中填入一个或多个组件时,如果只想使用它们的首选大小,就可以调用pack()方法。
    使用frame.add(Component C):将给定的组件添加到给框架的内容窗格中。

  5. 处理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 中预定义了很多颜色的名字,其中的常量封装了用户系统的各个元素的颜色。
  6. 特殊字体:人们可以通过字体名( font face name) 指定一种字体,字体名由字体家族名(font family name) 和 一个可选的 “Bold”后缀组成。
  7. 要想使用某种字体绘制字符,必须首先利用制定的字体名、字体风格和字体大小来创建一个Font类对象。
    Font sansbold14 = new Font("SansSerif", Font.BOLD, 14);
    其中字体的风格有Font.PLAIN, Font.BOLD, Font.ITALIC
    可以使用deriveFont(Float f)方法得到希望的字体大小。
    有关包围字符串的矩形:基线( baseline )是一条虚构的线,上坡度( ascent )是从基线到坡顶( ascenter )的距离,下坡度( decenter )是从基线到破敌( descenter )的距离。行间距( leading )
    是某一行的坡底到其下一行的坡顶的距离,字体的高度是连续两个基线的距离。
  8. 显示图像:可以是哦用ImageIcon类
    Image image = new ImageIcon(filename).getImage();

Chapter 8 事件处理

  1. 事件过程 event procedure:程序员将相应的特定事件编写代码,并将这些代码放置在过程中。事件源 event source,事件监听器 event listener。监听器对象是实现了特定监听器接口的类的实例,监听器必须有一个被称为actionPerformed的方法,接收一个actionEvent参数。事件源是一个能够注册监听器对象并发送事件对象的对象。
  2. 动态改变观感:调用静态UIManager.setLookAndFeel方法,并提供所想要的观感类名,然后再调用SwingUtilities.updateComponentTreeUI刷新全部的组件集。
  3. 适配器类:窗口佳宁器必须是实现WindowListener接口的类的一个对象。
  4. 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。
  5. 将动作和击键关联起来要生成KeyStroke对象,可以条用KeyStroke类的静态getKeyStroke方法。
    KeyStroke ctrlBKey = keyStroke.getKeyStroke("ctrl B");
  6. 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);
  7. 鼠标事件:当用户点击鼠标时,就会调用三个监听器参数:鼠标第一次被调用时调用mousePressed, 鼠标被释放时调用mouseReleased, 最后调用mouseClicked
    当鼠标移动时,有两个独立接口MouseListener 用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口 和 MouseMotionLIstener接收鼠标移动事件的抽象适配器类。
    只有鼠标在一个组件内部停留时才会调用mouseMoved方法,即使鼠标拖动到组件外面,mouseDragged
    方法也会被调用。另外,mouseEntered和mouseExited这两个方法是在鼠标进入或移出组件时被调用。
  8. AWT事件继承层次:事件对象封装了事件源和监听器彼此通信的时间信息。AWT将事件分为低级( low-level )语义( semantic )事件。语义时间表示用户动作的事件,低级事件是形成那些事件的事件。
    常用的5个低级事件是:KeyEvent、MouseEvent、MouseWheelEvent、FocusEvent和WindowEvent。

Chapter 9 Swing用户界面组件

  1. 模型-视图-控制器:设计模式。
  2. 流布局管理器(flow layout mananger):是面板默认的布局管理器。
    • SetLayout(Layout Manager):为容器设置布局管理器
    • add(Component C):将组件添加到容器中并返回其引用。
    • FlowLayout(int align, int hgap, int vgap):构建一个系的FlowLayout对象,设置对齐,水平和垂直间距。
  3. 边框布局管理器(border layout manager):是JFrame内容窗格的默认布局管理器。当容器被缩放时,边缘组件的尺寸不会改变,而中间组建的大小会变化。添加组件时可以指定BorderLayout类中的CENTER、NORTH、SOUTH、EAST和WEST常量,默认为CENTER。
    边框布局会拓展所偶有的尺寸以填满可用空间。
  4. 网格布局(GridLayout):在网格布局对象的构造器中需要指定行数和列数panel.setLayout(new GridLayout(4, 4));
  5. 文本输入:文本域(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);开启换行特性避免裁剪过长的行。
  6. 标签:标签是容纳文本框的组件,没有任何修饰符,也不响应用户输入。可以利用标签标示组件:
    • 用相应的文本构造一个JLAbel组件。
    • 将标签组件放置在距离需要标识的组件的足够近的地方。
      构造器可以指定初始文本和图标,也可以选择内容排列方式——用SwingConstants接口中几个常量。
      JLabel label = new Label("User name: ", SwingConstants.RIGHT);
  7. 密码域:每个输入的字符都是用回显字符(echo character)显示出来,JPasswordField类实现了这样的功能。
    setEchoChar(char echo)为密码域设置回显字符。
  8. 滚动窗格:在Swing中,文本区没有滚动条,需要将文本区插入到滚动窗格(scroll pane)中。
    JScrollPane scrollPane = new JScrollPane(textArea)
  9. 选择组件:复选框:复选框需要紧邻的标签来说明其用途
    JCheckBox bold = new JCheckBox("Bold");
    使用setSelect方法来选定或取消复选框
    bold.setSelect(true);
    isSelected方法返回每个复选框当前的状态。
  10. 单选按钮(Radio Button Group):为按钮组构造ButtonGroup对象,然后再将JRadioButton类型的对象加入到按钮组中。仍需要进行布局。
    JRadioButton smallButton = new JRadioButton("Small", true);
    第二个参数表明这个按钮初始状态是否被选择。
  11. 边框(borders):可以在任何继承了JComponent的组件上应用边框,最常用的用途是在一个面板周围防止一个边框,然后用其他洪湖街面元素填充边框。方法
    • 调用BorderFactory静态方法创建边框:凹斜面、凸斜面、蚀刻、直线和蒙刻。
    • 可以给边框添加标题,将边框传递给BorderFactory.createTitledBorder。
    • 调用BorderFactory.createCompoundBorder将边框组合起来使用。
    • 调用JComponent类中的setBorder方法将结果添加到组建中。
      Border etched = BorderFactory.createEcthedBorder();
      Border titled = BorderFactory.createTitledBorder(etched, "A Title");
      panel.setBorder(etched);
  12. 组合框( 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方法获取当前选项。
  13. 滑动条:允许进行连续值的选择。
    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);
  14. 菜单:菜单栏(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接口。
  15. 工具栏:是提供快捷访问的按钮栏。可以将其任意移动,可以完全脱离框架。
    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");
  16. 对话框:AWT分为模式对话框(在结束对它的处理之前不允许与应用程序的其余窗口进行交互)和无模式对话框(允许用户在对话框的应用程序的其他窗口输入信息)。

  17. 文件对话框

    • 建立一个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();将文件视图安装到文件选择器中。
  18. 颜色选择器:JColorChooser, 是一个组件,而不是一个对话框。
    Color selectedColor = JColorChooser.showDialog(parent, title, initialColor);
    也可以设置一个无模式的颜色选择器对话框,需要提供:父组件,对话框标题,选择选择模式,颜色选择器,OK和Cancel按钮对话框。

阅读全文
0 0
原创粉丝点击