03 2011 档案
摘要:6.1.6 JSeparator类JSeparator类是一种特殊的组件,他在JMenu上提供分隔符。JPopupMenu与JToolBar类也支持分隔,但是每一个都使用JSeparator类的相应子类。除了可以放置在菜单上以外,JSeparator类也可以放置在任何我们希望使用水平或是垂直线来分隔屏幕不同区域的地方。 JSeparator是一个严格的可视化组件,所以,他没有数据模型。 创建JSeparator组件 要为菜单创建一个分隔,我们并不直接创建一个JSeparator,尽管我们可以这样做。相反,我们调用JMenu的addSeparator()方法,而菜单会创建分隔符并将其添加为下一个
阅读全文
摘要:6.1.4 JMenuItem类JMenuItem组件是用户可以在菜单栏上选择的预定义组件。作为AbstractButton的子类,JMenuItem是一个特殊的按钮组件,其行为类似于JButton。除了作为AbstractButton的子类,JMenuItem类共享JButton的数据模型(ButtonModel接口与DefaultButtonModel实现)。创建JMenuItem组件JMenuItem有六个构造函数。这些构造函数可以使得我们初始化菜单项的字符串或是图标以及菜单项的热键。并不存在显式的构造函数允许我们在创建时设置所有三个选项,除非我们将其作为Action的一部分。publi
阅读全文
摘要:本书的前面两章描述了一些低级的Swing组件。本章将会深入Swing面向菜单的组件。菜单与工具栏通过提供一些可视化的命令选项可以使得我们的程序更为友好。尽管Swing组件可以支持多个按键的命令序列,菜单被设计用来提供使用鼠标的图形化选择,而不是通过键盘。 本章将要讨论的菜单组件的使用如下: 对于级联菜单,我们可以创建一个JMenu组件,并将其添加到JMenuBar。 对于JMenu中的可选菜单,我们可以创建一个JMenuItem组件,并将其添加到JMenu。 要创建子菜单,我们可以向JMenu添加一个新的JMenu,并向新菜单添加JMenuItem选项。 然后,当一个JMenu被选中时,系统会
阅读全文
摘要:5.5 JRadionButton类当我们希望创建一个相斥的可切换组件组时我们可以使用JRadioButton。尽管由技术上来说,我们可以将一组JCheckBox组件放在一个ButtonGroup中,并且每次只有一个可以选中,但是他们看起来并不正确。至少由预定义的观感类型来看,JRadioButton与JCheckBox组件看起来是不同的,如图5-10所示。这种外观上的区别可以告诉终端用户可以期望组件的特定行为。 JRadioButton是由几方面构成的。类似于JToggleButton与JCheckBox,JRadioButton也使用一个ToggleButtonModel来表示其数据模型。
阅读全文
摘要:5.4 JCheckBox类JCheckBox类表示切换组件,在默认情况下,这个组件在接近文本标签处显示了一个复选框图标,用于两状态选项选择。复选框使用一个可选的复选标记来显示对象的当前状态,而不是如JToggleButton保持按钮按下状态。对于JCheckBox,图标显示了对象的状态,而对于JToggleButton,图标则是标签的一部分,通常并不用于显示状态信息。JCheckBox与JToggleButton之间除了UI相关部分不同外,这两个组件是相同的。图5-5演示了在一个匹萨预定程序中复选框的样子。 JCheckBox是由几部分构成的。与JToggleButton类似,JCheck.
阅读全文
摘要:5.3 JToggleButton类JToggleButton是第一个可切换的组件。首先讨论JToggleButton类是因为他是其他们非面向菜单的组件,JCheckBox与JRadioButton,的父类。JToggleButton类似于JButton,当被选中时处理按下状态,相反则会返回到未选中状态。要取消被选中的组件,我们必须重新选择该组件。JToggleButton并不是一个被广泛使用的组件,但是我们会发现在工具栏上这个组件会非常有用,例如在Microsoft Word中或是在一个文件对话奇巧事,如图5-2所示。 定义JToggleButton结构是两个自定义AbstractButt.
阅读全文
摘要:现在我们已经了解了相对简单的Swing组件JLabel与JButton的功能,现在我们来了解一些更为活跃的组件,特别是这些可以切换的组件。这些称之为可切换的组件-JToggleButton,JCheckBox与JRadioButton-为我们的用户提供了由一个选项集合中进行选择的方法。这些选项或者是打开,或者是关闭的,或者是允许,或者是禁止的。当表示在一个ButtonGroup中时,每次组中只有一个选项可以被选中。为了处理选中状态,组件与ToogleButtonModel共享一个共同的数据模型。下面我们来了解一下数据模型,使用ButtonGroup的组件组合机制,以及单个的组件。 5.1 To
阅读全文
摘要:4.7 JPanel类最后一个基本的Swing组件是JPanel组件。JPanel组件可以作为一个通常目的的窗口对象,替换了AWT的Panel窗口,而当我们需要一个可绘制的Swing组件区域时,JPanel替换了Canvas组件。 4.7.1 创建JPanelJPanel有四个构造函数: public JPanel()JPanel panel = new JPanel(); public JPanel(boolean isDoubleBuffered)JPanel panel = new JPanel(false); public JPanel(LayoutManager manager)JP
阅读全文
摘要:4.6 JButton类JButton组件是可以被选中的最基本的AbstractButton组件。他支持文本,图像以及基于HTML的标签,如图4-12所示。4.6.1 创建JButtonJButton类具有5个构造函数:public JButton()JButton button = new JButton(); public JButton(Icon image)Icon icon = new ImageIcon("dog.jpg");JButton button = new JButton(icon); public JButton(String text)JButto
阅读全文
摘要:4.5 AbstractionButton类如图4-1所示,AbstractButton类是作用在幕后作为所用 的Swing按钮组件的一个重要Swing类。在本章稍后的JButton类中所描述的JButton是最简单的子类。其余的子类将会在后续的章节中进行描述。 所有的AbstractButton子类使用ButtonModel接口来存储数据模型。DefaultButtonModel类是所使用的默认实现。另外,我们可以将任意的AbstractButton对象组合为一个ButtonGroup。尽管这种组合对于JRadioButton与JRadioButtonMenuItem组件最为自然,然而任意的
阅读全文
摘要:4.4 Icon接口Icon接口用来将图标与各种组件相关联。一个图标可以是简单的绘画或者是使用ImageIcon类由磁盘所载入的GIF图像。这个接口包含描述尺寸的两个属性以及一个用来绘制图标的方法。 public interface Icon { // Properties public int getIconHeight(); public int getIconWidth(); // Other methods public void paintIcon(Component c, Graphics g, int x, int y);}4.4.1 创建图标图标的创建非常简单,只需...
阅读全文
摘要:4.3 JLabel类我们要近距离查看的第一个真正的Swing组件就是最简单的JLabel。JLabel用作AWT Label的替换组件,但是所能做的事情更多。AWT Label仅限制为单行文本,JLabel可以是文本,图片,或者是两者都有。文本可以是单行文本也可以是HTML文本。另外,JLabel可以支持不同的允许与禁止的图片。图4-6显示了一些示例JLabel组件。 4.3.1 创建JLabelJLabel有6个构造函数: public JLabel()JLabel label = new JLabel(); public JLabel(Icon image)Icon icon = ne.
阅读全文
摘要:4.2 JToolTip类Swing组件支持当光标停留在其上时显示简短的弹出信息的功能。用来显示弹出信息的类就是JToolTip。4.2.1 创建JToolTip调用JComponent的public void setToolTipText(String text)方法可以使得当鼠标停留在一个安装了弹出信息的组件上时自动创建JToolTip实例。我们通常并不直接调用JToolTip构造函数。只有一个构造器,而他是无参数的变体。工具提示的文本通常只是一行的长度。然而,如果文本字符串以开头(在许多情况下如此),那么文本的内容可以任意的HTML 3.2格式化文本。例如,下面的代码使得弹出信息如图4-
阅读全文
摘要:在第3章,我们简要介绍了JFC/Swing工程组件所用的Model-View-Controller(MVC)模式。在本章中,我们将会开始探讨如何使用许多可用组件中的关键部分。 所有的Swing组件都是以JComponent类为起点的。尽管Swing库的某些部分并不以JComponent类为根,但所有的组件在其继承的某些级别上共享JComponent类作为通用父类。JComponent类定义通用的行为与属性。在本章中,我们将会了解一些通用功能,例如组件绘制,自定义义,工具提示以及变化大小。 随着特定JComponent子孙类被关注 ,我们将会特别了解JLabel,JButton以及JPanel,
阅读全文
摘要:第2章探讨了如何处理Swing组件的事件生产者与消费者。我们了解了Swing组件的事件处理如何超出原始的AWT组件的事件处理功能。在本章中,我们会进一步深入Swing组件设计,来探讨称之为Model-View-Controller(MVC)的体系地构。 3.1 理解MVC流在1980年后首次被引入Smalltalk后,MVC体系结构是第2章所描述的观察者模式的一种特殊形式。MVC的模型部分存放组件的状态,并且用作Subject。MVC的视图部分用作Subject的观察者来显示模型状态。视图创建控制器,其中定义了用户界面如何响应用户输入。 3.1.1 MVC通信图3-1显示MVC元素如何进行通信
阅读全文
摘要:2.3 Swing特定的事件处理请记住,Swing组件是构建在AWT库之上的,Swing组件库具有一些改进的功能从而使得事件处理更为简单。功能改进覆盖AWT核心事件处理特性之上,由基本的动作监听到焦点管理。 为了简化事件处理,Swing库使用Action接口扩展了原始的ActionListener接口来存储具有事件处理器的可视属性。这使得事件处理器的创建独立于可视化组件。然后,当Action在稍后与一个组件相关联时,组件直接由事件处理器自动获取信息(例如按钮标签)。这包括当Action被修改时更新标签的通知。AbstractAction与TextAction类实现了这个概念。 Swing库同时
阅读全文
摘要:2.2.4 Timer类除了EventQueue的invokeAndWait()与invokeLater()方法外,我们还可以使用Timer类来创建在事件分发线程上执行的动作。Timer提供了一种在预定义的时间之后通知ActionListener的方法。计时器可以重复通知监听吕在,或者是只通知一次。 创建计时器对象 下面是用于创建在ActionListener调用之间指定毫秒时延的Timer的构造器: public Timer(int delay, ActionListener actionListener);// 1 second intervalTimer timer = new Time
阅读全文
摘要:2.2.3 管理监听器列表如果我们正在创建我们自己的组件并且希望这些组件触发事件,我们需要维护一个要通知的监听器列表。如果监听器列表是用于AWT事件的,我们可以使用AWTEventMulticaster类用于列表管理。对于Swing库而言,如果事件并不是一个预定义的AWT事件类型,我们需要自己管理监听器列表。通过使用javax.swing.event包中的EventListenerList类,我们不再需要手动管理监听器列表,也无需担心线程安全。而且如果我们需要获取监听器列表,我们可以通过public EventLIstener[] getListener(Class listenerType)
阅读全文
摘要:2.2.2 使用属性变化监听器作为观察者除了基本的事件委托机制以外,JavaBean引入另一种观察者设计模式的变体,这次是通过属性变化监听器。PropertyChangeListener实现是观察者模式的确切表示。每一个观察者观察Subject的一个属性的变化。当Subject中发生变化时,观察者会被通知新的状态。图2-4显示了与JavaBean库中用于属性变化处理的特定类相关的观察者模式结构。在这种情况下,可观察的Subject具有一个add/remove属性变化监听器方法集合以及一个状态被监视的属性。 使用PropertyChangeListener,注册的监听器集合是在PropertyC
阅读全文
摘要:2.2 多线程的Swing事件处理为了提高其效率并降低其复杂性,所有的Swing组件都被设计为非线程安全的。尽管这听起比较恐怖,他只是简单的意味着对Swing组件的所有访问需要由一个单一线程完成--事件分发线程。如果我们并不确定我们位于一个特定的线程中,我们可以使用public static boolean isDispatchThread()方法请求EventQueue类或是通过public static boolean isEventDispatchThread()方法请求SwingUtilities类。后者只是作为前者的代理。 通过EventQueue类的帮助,我们可以创建Runnabl
阅读全文