Swing菜单与工具栏(三)(一)

2014-11-24 00:38:48 · 作者: · 浏览: 0

6.1.5 JSeparator类
JSeparator类是一种特殊的组件,他在JMenu上提供分隔符。JPopupMenu与JToolBar类也支持分隔,但是每一个都使用JSeparator类的相应子类。除了可以放置在菜单上以外,JSeparator类也可以放置在任何我们希望使用水平或是垂直线来分隔屏幕不同区域的地方。

JSeparator是一个严格的可视化组件,所以,他没有数据模型。

创建JSeparator组件

要为菜单创建一个分隔,我们并不直接创建一个JSeparator,尽管我们可以这样做。相反,我们调用JMenu的addSeparator()方法,而菜单会创建分隔符并将其添加为下一个菜单项。他是一个JSeparator(不是JMenuItem子类)的事实是隐藏的。JMenu还有一个insertSeparator(int index)方法,这个方法可以使得我们在菜单上指定的位置添加分隔,这并不必须是下一个位置。

如果我们希望在菜单以外使用JSeparator(例如,在布局中分隔两个面板),我们应该使用JSeparator的两个构造函数:

public JSeparator()
JSeparator jSeparator = new JSeparator();

public JSeparator(int orientation)
JSeparator jSeparator = new JSeparator(JSeparator.VERTICAL);


这两个构造函数使得我们可以创建一个水平或是垂直分隔。如果没有指定方向,则为水平方向。如果我们希望显示式指定方向,我们可以使用JSeparator的常量HORIZONTAL或是VERTICAL。

JSeparator属性

在我们拥有JSeparator以外,我们就可以像其他的组件一样将其添加到屏幕中。组件的初始维度是空的(宽度与高度均为0),所以如果屏幕的布局管理器询问组件的尺寸应是多少,分隔符将会回复他不需要空间。另一方面,如果布局管理器提供一定量的空间,如果方向合适则分隔就会使用这个空间。例如,将一个水平JSeparator添加到BorderLayout面板的北侧则会在屏幕上绘制一个分隔线。然而,如果将水平JSeparator添加到相同面板的东侧则不会绘制任何内容。对于垂直JSeparator,其行为则是相反的:北侧将是空的,而在东侧则会出现垂直线。

表6-7显示了JSeparator的四个属性。

JSeparator属性

属性名
数据类型
访问性

accessibleContext
AccessibleContext
只读

orientation
int
读写绑定

UI
SeparatorUI
读写绑定

UIClassID
String
只读

自定义JSeparator观感

预安装的观感类型集合下的JSeparator外观以及其他的菜单组件显示在图6-3中。

表6-8列出了JSeparator的UIResource相关属性集合。对于JSeparator组件,有五个不同的属性。

JSeparator UIResource元素

属性字符串
对象类型

Separator.background
Color

Separator.foreground
Color

Separator.insets
Insets

Separator.thickness
Integer

SeparatorUI
String

6.1.6 JPopupMenu类
JPopupMenu组件是弹出菜单组件的容器,可以显示在任何地方并且为JMenu所支持。当一个编程者定义的触发事件发生时,我们显示JPopupMenu,并且菜单显示所包含的菜单组件。与JMenuBar类似,JpopupMenu使用SingleSelectionModel来管理当前被选中的元素。

创建JpopupMenu组件

JPopupMenu有两个构造函数:

public JPopupMenu()

JPopupMenu jPopupMenu = new JPopupMenu();

public JPopupMenu(String title)

JPopupMenu jPopupMenu = new JPopupMenu("Welcome");


如果需要,只有一个函数允许我们初始化菜单标题。标题的处理方式会依赖于所安装的观感。当前安装的观感会忽略标题。

向JPopupMenu添加菜项

与JMenu类似,一旦我们有了JPopupMenu,我们需要向其添加菜单项;否则,菜单将会是空的。有三个JPopupMenu方法可以添加菜单项,一个用于添加分隔符。

public JMenuItem add(JMenuItem menuItem);

public JMenuItem add(String label);

public JMenuItem add(Action action);

public void addSeparator();


另外还有一个由Container所继承的add()方法可以用于添加通常的AWT组件:

public Component add(Component component);
添加菜单项的通常方法是使用第一个add()方法。我们独立于弹出菜单创建菜单项,包含其行为行定,然后将其关联到菜单。使用第二个add()方法,我们必须将事件处理器关联到由方法返回的菜单;否则,当被选中时菜单并不会响应。下面的代码显示了两种方法。我们使用哪一种方法完全依赖于我们的喜好。可视化编程环境,例如JBuilder,会使用第一种。因为第一种方法并不是十分复杂,如果不是全部,绝大多数的程序员应该使用第一种方法。

JPopupMenu popupenu = new JPopupMenu();

ActionListener anActionListener = ...;

// The first way

JMenuItem firstItem = new JMenuItem("Hello");

firstItem.addActionListener(anActionListener);

popupMenu.add(firstItem);

// The second way

JMenuItem secondItem = popupMenu.add("World");

secondItem.addActionListener(anActionListener);
使用Action来创建与JPopupMenu结合使用的菜单项的方式类似于JMenu。然而,依据JPopupMenu类的Javadoc,并不鼓励使用add()方法的Action变体。相反,可以将Action传递给JMenuItem的构造函数,或者是使用setAction()方法进行配置,然后将其添加到JPopupMenu。为什么这个方法没有被deprecated并不清楚。

最后,我们可以使用addSeparator()方法添加分隔。

除了在菜单尾部添加菜单项,我们可以在指定的位置添加菜单项,或者是在指定的位置添加分隔。

public JMenuItem insert(Component component, int position);
public JMenuItem insert(Action acti