4.5 AbstractionButton类
如图4-1所示,AbstractButton类是作用在幕后作为所用 的Swing按钮组件的一个重要Swing类。在本章稍后的JButton类中所描述的JButton是最简单的子类。其余的子类将会在后续的章节中进行描述。
所有的AbstractButton子类使用ButtonModel接口来存储数据模型。DefaultButtonModel类是所使用的默认实现。另外,我们可以将任意的AbstractButton对象组合为一个ButtonGroup。尽管这种组合对于JRadioButton与JRadioButtonMenuItem组件最为自然,然而任意的AbstractButton子类都会起作用。
4.5.1 AbstractButton属性
表4-11列出了AbstractButton子类所共享的32个属性。这些属性可以使得我们自定义所有按钮的外观。
属性名 |
数据类型 |
访问性 |
action |
Action |
读写绑定 |
actionCommand |
String |
读写 |
actionListeners |
ActionListener[] |
只读 |
borderPainted |
boolean |
读写绑定 |
changeListeners |
ChangeListener[] |
只读 |
contentAreaFilled |
boolean |
读写绑定 |
disabledIcon |
Icon |
读写绑定 |
disabledSelectedIcon |
Icon |
读写绑定 |
disabledMnemonicIndex |
int |
读写绑定 |
enabled |
boolean |
只写 |
focusPainted |
boolean |
读写绑定 |
horizontalAlignment |
int |
读写绑定 |
horizontalTextPosition |
int |
读写绑定 |
icon |
Icon |
读写绑定 |
iconTextGap |
int |
读写绑定 |
itemListeners |
ItemListener[] |
只读 |
layout |
LayoutManager |
只写 |
margin |
Insets |
读写绑定 |
mnemonic |
char |
读写绑定 |
mnemonic |
int |
只写 |
model |
ButtonModel |
读写绑定 |
multiClickThreshhold |
long |
读写 |
pressedIcon |
Icon |
读写绑定 |
rolloverEnabled |
boolean |
读写绑定 |
rolloverIcon |
Icon |
读写绑定 |
rolloverSelectedIcon |
Icon |
读写绑定 |
selected |
boolean |
读写 |
selectedIcon |
Icon |
读写绑定 |
selectedObjects |
Object[] |
只读 |
text |
String |
读写绑定 |
UI |
ButtonUI |
读写 |
verticalAlignment |
int |
读写绑定 |
verticalTextPosition |
int |
读写绑定 |
在这里值得一提的就是multiClickThreshhold。这个属性表示以毫秒计数的时间。如果一个按钮在这段时间间隔被鼠标多次选中,并不会产生额外的动作事件。默认情况下这个属性值为0,意味着每一次点击都会产生一个事件。为了避免在重要的对话框中偶然重复提交动作的发生,应将这个属性值设置0以上的合理值。
ButtonModel/Class DefaultButtonModel接口
ButtonModel接口被用来描述AbstractButton组件的当前状态。另外,他描述了为所有不同的AbstractButton子类所支持的事件监听器对象的集合。其定义如下:
public interface ButtonModel extends ItemSelectable {
// Properties
public String getActionCommand();
public void setActionCommand(String newValue);
public boolean isArmed();
public void setArmed(boolean newValue);
public boolean isEnabled();
public void setEnabled(boolean newValue);
public void setGroup(ButtonGroup newValue);
public int getMnemonic();
public void setMnemonic(int newValue);
public boolean isPressed();
public void setPressed(boolean newValue);
public boolean isRollover();
public void setRollover(boolean newValue);
public boolean isSelected();
public void setSelected(boolean newValue);
// Listeners
public void addActionListener(ActionListener listener);
public void removeActionListener(ActionListener listener);
public void addChangeListener(ChangeListener listener);
public void removeChangeListener(ChangeListener listener);
public void addItemListener(ItemListener listener);
public void removeItemListener(ItemListener listener);
}
我们将要使用的特定的ButtonModel实现是DefaultButtonModel类,除非我们定义了自己的类。DefaultButtonModel类定义了不同的事件监听器的所有事件注册方法并且管理按钮状态并组织在ButtonGroup中。表4-12显示其9个属性。除了selectedObjects以外,他们均来自ButtonGroup接口,selectedObjects属性是DefaultButtonModel类的新成员,但是对于JToggleButton十分有用。在第5章中将会讨论ToggleButtonModel。
DefaultButtonModel属性
属性名
|
数据类型
|
访问性
|
actionCommand
|
String
|
读写
|
armed
|
boolean
|
读写
|
enabled
|
boolean
|
读写
|
group
|
ButtonGroup
|
读写
|
mnemonic
|
int
|
读写
|
pressed
|
boolean
|
读写
|
rollover
|
boolean
|
读写
|
selected
|
boolean
|
读写
|
selectedObjects
|
Object[]
|
只读
|
大多数情况下,我们并不直接访问ButtonModel。相反,使用ButtonModel的组件封装他们属性调用来更新模型属性。
理解AbstractButton热键
热键是一种特殊的键盘快捷键,当按下时会使用一个特定的动作发生。在前的JLable类一节中讨论JLablel时,按下所显示的热键会使得相关联的组件获得输入焦点。在AbstractButton的情况下,按下按键的热键会使得按钮被选中。
热键的实际点击需要一个观感特定的热键的点击(这个键通常是Alt键)。所以,如果一个按钮的热键是B键,我们需要按下Alt-B来激活具有B热键的按钮。当按钮被激活时,所注册的监听器会被通知相应的状态变化。例如,对于JButton,所有的ActionListener对象都会被通知。
如果热键是按钮文本标签的一部分,我们会看到这个字符以下划线表示。这会由于当前的观感不同而有不同的显示。另外,如果热键并不是文本标签的一部分,对于特定的热键的选中并不有可见的指示符,除非观感在工具提示文本中进行显示。
图4-11显示了两个按钮:一个具有W热键,而另一个具有H热键。左边的按钮在其内容具有W的标签,所以第一个W会以下划线显示。第二个组件并没有由按钮上的这种行为获益,但是在Ocean观感中,如果工具提示文本进行了设置则会时行标识。
要为抽象按钮赋予一个热键,我们可以使用任意一个setMnemonic()方法。其中一个接受char参数,而另一个则接受int参数。就个人而言,我比较喜欢int版本,其参数值是KeyEvent类中众多VK_*常量的一个。我们也可以通过displayedMnemonicIndex属性来指定热键。
AbstractButton button1 = new JButton("Warning");
button1.setMnemonic(KeyEvent.VK_W);
content.add(button1);
理解AbstractButton图标
AbstractButton具有七个特定的图标属性。默认的图标是icon属性。这个属性用于所有的情况,除非指定了一个不同的图标或是组件提供了默认的行为。selectedIcon属性是按钮被选中时所使用的图标。pressedIcon是按钮被按下时所用的图标。使用这两种图标中的哪一种依赖于组件,因为JButton被按下但是并没有被选中,而JCheckBox被选中却没有被按下。
当按钮通过setEnabled(false)被禁止时要使用disabledIcon与disabledSelectedIcon属性。默认情况下,如果图标是一个ImageIcon,将会使用图标的一个灰度平衡版本。
其他的两个属性,rolloverIcon与rolloverSelectedIcon允许我们当鼠标划过按钮时(rolloverEnabled为true)显示不同的图标。
理解内部的AbstractButton位置
horizontalAlignment, horizontalTextPosition, verticalAlignment与verticalTextPostion属性与JLabel类共享相同的设置与行为。表4-13列出这些属性。
位置属性
|
可用调用
|
horizontalAlignment
|
LEFT, CENTER, RIGHT
|
horizontalTextPosition
|
LEFT, CENTER, RIGHT
|
verticalAlignment
|
TOP, CENTER, BOTTOM
|
verticalTextPosition
|
TOP, CENTER, BOTTOM
|
4.5.2 处理AbstractButton事件
尽管我们并不会直接创建一个AbstractButton实例,但是我们会创建其子类。所有子类共享一个共同的事件处理功能集合。我们可以向抽象按钮注册PropertyChangeListener,ActionListener,ItemListener以及ChangeListener对象。在这里将会讨论PropertyChangeListener对象,其余的对象将会在后续的章节中进行讨论。
与JComponent类类似,AbstractButton组件支持当类的实例的绑定属性变化时支持PropertyChangeListener对象注册的检测。与JComponent类不同的是,AbstractButton组件提供了下列的类常量集合来表示不同的属性变化:
•BORDER_PAINTED_CHANGED_PROPERTY •CONTENT_AREA_FILLED_CHANGED_PROPERTY •DISABLED_ICON_CHANGED_PROPERTY •DISABLED_SELECTED_ICON_CHANGED_PROPERTY •FOCUS_PAINTED_CHANGED_PROPERTY •HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY •HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY •ICON_CHANGED_PROPERTY •MARGIN_CHANGED_PROPERTY •MNEMONIC_CHANGED_PROPERTY •MODEL_CHANGED_PROPERTY •PRESSED_ICON_CHANGED_PROPERTY •ROLLOVER_ENABLED_CHANGED_PROPERTY •ROLLOVER_ICON_CHANGED_PROPERTY •ROLLOVER_SELECTED_ICON_CHANGED_PROPERTY •SELECTED_ICON_CHANGED_PROPERTY •TEXT_CHANGED_PROPERTY •VERTICAL_ALIGNMENT_CHANGED_PROPERTY •VERTICAL_TEXT_POSITION_CHANGED_PROPERTY
所以,我们可以创建一个使用这些常量的PropertyChangeListener,而不需要硬编码特定的文本字符串,如列表4-5所示。
import javax.swing.*;
import java.beans.*;
public class AbstractButtonPropertyChangeListener
implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if (e.getPropertyName().equals(AbstractButton.TEXT_CHANGED_PROPERTY)) {
String newText = (String) e.getNewValue();
String oldText = (String) e.getOldValue();
System.out.println(oldText + " changed to" + newText);
} else if (e.getPropertyName().equals(AbstractButton.ICON_CHANGED_PROPERTY)) {
Icon icon = (Icon) e.getNewValue();
if (icon instanceof ImageIcon) {
System.out.println("New icon is an image");
}
}
}
}
分享到:
相关推荐
Swing组件是Java GUI(图形用户界面)编程中的核心元素,它是Java Foundation Classes (JFC) 的一部分。Swing提供了一系列丰富的组件,用于构建功能强大的桌面应用程序。在本实例中,我们将深入探讨Swing组件的使用...
在Java Swing组件全演示中,我们将深入探讨Swing的核心概念、组件和设计原则。 首先,Swing是基于AWT(Abstract Window Toolkit)的,但提供了更丰富的功能和更好的外观。Swing组件通常被称为轻量级组件,因为它们...
在"swing组件介绍(一)"这篇博文中,作者可能涵盖了Swing组件的基础知识,包括以下几个核心点: 1. **基础组件**:Swing提供了许多基础组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)、复选框...
Swing是Java编程语言中...以上就是Swing组件的一些核心功能和用法,它们共同构成了Swing组件体系,为开发复杂的Java桌面应用提供了强大的支持。通过灵活组合和定制这些组件,开发者可以创建出满足各种需求的用户界面。
综上所述,"Swing组件大全"不仅涵盖了Swing库中的所有核心组件,还涵盖了数据库操作、Excel文件处理和自定义布局管理,是学习和开发Swing应用的宝贵资源。通过深入理解和实践这些知识点,开发者可以构建出功能强大且...
Java-GUI编程之Swing组件是Java编程语言中用于构建图形用户界面的一个核心组件。Swing是Java Foundation Classes(JFC)的一个组成部分,提供了丰富的图形用户界面组件,帮助开发者快速构建复杂的图形用户界面。 ...
Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分。在 Swing 中,开发者可以创建...通过实际的编程练习,结合本文所提及的知识点,你将能更好地掌握Swing组件的用法。
在"java基于Swing组件的GUI设计"这个主题中,我们将深入探讨如何利用Swing进行GUI开发。 首先,Swing组件是轻量级的,它们大部分是用Java实现的,这使得Swing应用程序可以在不同的操作系统上保持一致的外观和行为。...
【Java Swing组件在资产管理系统中的应用】 Java Swing是Java Standard Edition (Java SE)的一部分,它提供了一套丰富的用户界面组件,用于构建桌面应用程序。在资产管理系统中,Swing发挥着核心作用,创建出直观、...
在这个“Java Swing组件综合练习”中,我们将深入探讨几个核心组件的使用,包括表格(Table)、树(Tree)、按钮(Button)以及菜单(Menu)和工具条(ToolBar)。 首先,让我们来看看表格组件(JTable)。JTable是...
开源的Swing组件JIDE是一款强大的Java开发工具,专为构建功能丰富的图形用户界面(GUI)而设计。它扩展了Java Swing库的功能,提供了许多预设的、高度可定制的组件,大大简化了开发人员的工作。JIDE组件库涵盖了各种...
在实际应用中,开发者可以根据需求组合使用JTree和JTable,与其他Swing组件一起构建复杂的用户界面。MVC模式使得组件的扩展和维护变得简单,而JTree和JTable则提供了丰富的功能,帮助开发者高效地展示和操作数据。
在Java中,Swing组件的DnD操作通常涉及到以下几个核心类和接口: 1. `Transferable`: 表示要拖动的数据,实现此接口的类可以决定数据的格式和内容。 2. `DragSource`: 创建和管理拖动操作的起点。 3. `DropTarget`:...
《基于Swing组件的餐饮管理系统详解》 在IT行业中,开发高效、易用的管理系统是提升业务运营效率的关键。本文将深入探讨一个采用Java Swing组件构建的餐饮管理系统,旨在为开发者提供灵感和实用技巧,帮助他们在...
Swing组件属于AWT(Abstract Window Toolkit)组件的升级版本,它解决了早期AWT组件在设计上无法实现跨平台风格统一的缺陷。因为Java语言本身不受操作系统的影响,所以Swing组件被称为轻量级组件。 在Swing中,很多...
本资源“java swing所有组件展示”包含了对Swing组件的全面展示,这对于学习和理解Swing的各种功能至关重要。 Swing组件是轻量级的,意味着它们不依赖于操作系统底层的图形支持,而是完全由Java实现。这使得Swing...
综上所述,“浅析使用模型参数构造Java Swing组件”这一主题涵盖了Swing组件的核心概念,包括模型、视图、事件处理、组件定制、布局管理、国际化以及并发处理。理解和掌握这些知识点,对于开发高效、用户友好的Java...
Swing组件和MySQL数据库在Java开发中被广泛用于构建企业级的应用程序,特别是销售管理系统。这个项目名为"Swing组件+MySQL销售管理系统",显然它是一个基于Java Swing的图形用户界面(GUI)应用,用于管理和追踪销售...
- 此包包含了一系列与Swing组件边框样式相关的类,可以用来自定义组件的外观边界。 3. **`javax.swing.colorchooser`**: - 针对`JColorChooser`组件设计,提供颜色选择功能,允许用户在GUI中选择颜色。 4. **`...