Java/Swing JFC/Accessible
Версия от 18:01, 31 мая 2010; (обсуждение)
Содержание
- 1 A GUI to show accessible information coming from the components in an
- 2 An example of getting the Accessible information from a Button object
- 3 Associating a Label with a Component
- 4 Has Displayed Name
- 5 implement Accessible to make your object accessible
- 6 Setting a Description for Image Icons
- 7 Setting a Keyboard Accelerator for a Menu Item
- 8 Setting a Mnemonic for a Menu for Accessible
- 9 Setting a Mnemonic for Buttons for Accessible
- 10 Setting an Accessible Name for an Image Button
A GUI to show accessible information coming from the components in an
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O"Reilly
*/
// AssistiveExample.java
//A GUI to show accessible information coming from the components in an
//application. See BigExample.java for example of how to use this class.
//
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.accessibility.*;
import javax.accessibility.util.*;
public class BigExample extends JFrame {
public BigExample() {
super("Big Accessibility Example");
setSize(700,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JMenuBar jmb = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem openItem = new JMenuItem("Open");
JMenuItem saveItem = new JMenuItem("Save");
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
});
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(new JSeparator());
fileMenu.add(exitItem);
jmb.add(fileMenu);
setJMenuBar(jmb);
JTextArea jta = new JTextArea("[Notes]\n");
JScrollPane sp1 = new JScrollPane(jta);
sp1.setMinimumSize(new Dimension(200,200));
sp1.setPreferredSize(new Dimension(200,200));
String[] titles = { "Name", "Start Date", "Job Title" };
String[][] data = {
{"Jordan", "2001", "Director"},
{"Naveen", "1999", "Programmer"},
{"Jia", "2000", "Analyst"},
{"Brooks", "1998", "Evangelist"}
};
JTable table = new JTable(data, titles);
table.getAccessibleContext().setAccessibleDescription("Employee Statistics");
JPanel rightPane = new JPanel(new BorderLayout());
rightPane.add(new JScrollPane(table), BorderLayout.CENTER);
rightPane.add(new JLabel(new ImageIcon("logo.gif")), BorderLayout.SOUTH);
JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp1, rightPane);
getContentPane().add(jsp, BorderLayout.CENTER);
JPanel bPane = new JPanel();
JButton okButton = new JButton("Ok");
JButton applyButton = new JButton("Apply");
JButton clearButton = new JButton("Clear");
bPane.add(okButton);
bPane.add(applyButton);
bPane.add(clearButton);
getContentPane().add(bPane, BorderLayout.SOUTH);
setVisible(true);
}
public static void main(String args[]) {
new BigExample();
new AssistiveExample();
}
}
class AssistiveExample extends JPanel implements MouseMotionListener,
ActionListener, GUIInitializedListener {
Timer timer;
static JFrame frame;
JLabel nameLabel = new JLabel();
JLabel descriptionLabel = new JLabel();
JLabel tableLabel = new JLabel();
JCheckBox selectionCheckBox = new JCheckBox("Selection", false);
JCheckBox textCheckBox = new JCheckBox("Text", false);
JCheckBox valueCheckBox = new JCheckBox("Value", false);
JCheckBox componentCheckBox = new JCheckBox("Component", false);
JCheckBox actionCheckBox = new JCheckBox("Action", false);
JCheckBox hypertextCheckBox = new JCheckBox("Hypertext", false);
JCheckBox iconCheckBox = new JCheckBox("Icon", false);
JCheckBox tableCheckBox = new JCheckBox("Table", false);
JCheckBox editableTextCheckBox = new JCheckBox("EditableText", false);
JLabel classLabel = new JLabel();
JLabel parentLabel = new JLabel();
JLabel relationLabel = new JLabel();
JButton performAction = new JButton("Perform Action");
public AssistiveExample() {
frame = new JFrame("Assistive Example");
// Insert the appropriate labels and check boxes
setLayout(new GridLayout(0, 1)); // just make as many rows as we need
add(nameLabel);
add(descriptionLabel);
add(tableLabel);
add(new JSeparator());
add(actionCheckBox);
add(componentCheckBox);
add(editableTextCheckBox);
add(hypertextCheckBox);
add(iconCheckBox);
add(selectionCheckBox);
add(tableCheckBox);
add(textCheckBox);
add(valueCheckBox);
add(classLabel);
add(parentLabel);
add(relationLabel);
add(performAction);
setBorder(new TitledBorder("Accessible Component"));
performAction.addActionListener(this);
frame.getContentPane().add(this, BorderLayout.CENTER);
frame.setBounds(100, 100, 500, 600);
frame.setVisible(true);
// Check to see if the GUI subsystem is initialized
// correctly. (This is needed in JDK 1.2 and higher).
// If it isn"t ready, then we have to wait.
if (EventQueueMonitor.isGUIInitialized()) {
createGUI();
} else {
EventQueueMonitor.addGUIInitializedListener(this);
}
performAction.grabFocus();
}
public void guiInitialized() {
createGUI();
}
public void createGUI() {
// We want to track the mouse motions, so notify the
// Swing event monitor of this.
SwingEventMonitor.addMouseMotionListener(this);
// Start a Timer object to measure how long the mouse stays
// over a particular area.
timer = new Timer(500, this);
}
public void mouseMoved(MouseEvent e) {
// If the mouse moves, restart the timer.
timer.restart();
}
public void mouseDragged(MouseEvent e) {
// If the mouse is dragged, restart the timer.
timer.restart();
}
public void actionPerformed(ActionEvent e) {
//Find the component currently under the mouse.
Point currentPosition = EventQueueMonitor.getCurrentMousePosition();
Accessible comp = EventQueueMonitor.getAccessibleAt(currentPosition);
//If the user pressed the button, and the component
//has an accessible action, then execute it.
if (e.getActionCommand() == "Perform Action") {
AccessibleContext context = comp.getAccessibleContext();
AccessibleAction action = context.getAccessibleAction();
if (action != null)
action.doAccessibleAction(0);
else
System.out.println("No accessible action present!");
return;
}
// Otherwise, the timer has fired. Stop it and update the window.
timer.stop();
updateWindow(comp);
}
private void updateWindow(Accessible component) {
if (component == null) {
return;
}
// Reset the check boxes
actionCheckBox.setSelected(false);
selectionCheckBox.setSelected(false);
textCheckBox.setSelected(false);
componentCheckBox.setSelected(false);
valueCheckBox.setSelected(false);
hypertextCheckBox.setSelected(false);
iconCheckBox.setSelected(false);
tableCheckBox.setSelected(false);
editableTextCheckBox.setSelected(false);
// Get the accessibile context of the component in question
AccessibleContext context = component.getAccessibleContext();
AccessibleRelationSet ars = context.getAccessibleRelationSet();
nameLabel.setText("Name: " + context.getAccessibleName());
descriptionLabel.setText("Desc: " + context.getAccessibleDescription());
relationLabel.setText("Relation: " + ars);
// Check the context for each of the accessibility types
if (context.getAccessibleAction() != null)
actionCheckBox.setSelected(true);
if (context.getAccessibleSelection() != null)
selectionCheckBox.setSelected(true);
if (context.getAccessibleText() != null) {
textCheckBox.setSelected(true);
if (context.getAccessibleText() instanceof AccessibleHypertext)
hypertextCheckBox.setSelected(true);
}
if (context.getAccessibleComponent() != null) {
componentCheckBox.setSelected(true);
classLabel.setText("Class: " + context.getAccessibleComponent());
parentLabel.setText("Parent: " + context.getAccessibleParent());
}
if (context.getAccessibleValue() != null)
valueCheckBox.setSelected(true);
if (context.getAccessibleIcon() != null)
iconCheckBox.setSelected(true);
if ((context.getAccessibleTable() != null)
|| (context.getAccessibleParent() instanceof JTable)) {
tableCheckBox.setSelected(true);
tableLabel.setText("Table Desc: "
+ context.getAccessibleParent().getAccessibleContext()
.getAccessibleDescription());
} else {
tableLabel.setText("");
}
// On 1.4+ systems, you can check for editable text with these two
// lines.
// Note that because of the 1.4 restriction, these lines will not
// compile
// on a Mac system as of the time of this writing. You can comment out
// these lines and still compile/run the example, though.
//if (context.getAccessibleEditableText() != null)
// editableTextCheckBox.setSelected(true);
repaint();
}
}
An example of getting the Accessible information from a Button object
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O"Reilly
*/
// ActionExampleButton.java
//An example of getting the Accessible information from a Button object.
//(You could see this information by attaching an AssistiveExample object
//to the button. See BigExample.java for an example of that attachment.)
//
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleAction;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.accessibility.AccessibleStateSet;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class ActionExample extends Button implements ActionListener, Accessible {
public ActionExample() {
super("Press this Button");
addActionListener(this);
}
public AccessibleContext getAccessibleContext() {
return (new ActionAccessibleContext());
}
public void actionPerformed(ActionEvent e) {
System.out.println("The button was pressed!");
}
public void processActionEvent(ActionEvent e) {
super.processActionEvent(e);
}
// This class contains the accessible context for the component. Many
// abstract methods simply call the SwingUtilities class to get the job
// done; this is advised if you can get away with it. Otherwise, see the
// source code for SwingUtilities.
class ActionAccessibleContext extends AccessibleContext {
public ActionAccessibleContext() {
super();
setAccessibleName("Button");
setAccessibleDescription("Press the Button");
}
public AccessibleRole getAccessibleRole() {
// Fill in whatever role you want here
return (AccessibleRole.AWT_COMPONENT);
}
public AccessibleStateSet getAccessibleStateSet() {
return SwingUtilities.getAccessibleStateSet(ActionExample.this);
}
public int getAccessibleIndexInParent() {
return SwingUtilities
.getAccessibleIndexInParent(ActionExample.this);
}
public int getAccessibleChildrenCount() {
return SwingUtilities
.getAccessibleChildrenCount(ActionExample.this);
}
public Accessible getAccessibleChild(int i) {
return SwingUtilities.getAccessibleChild(ActionExample.this, i);
}
public Locale getLocale() {
// Ask the component what its locale is
return ActionExample.this.getLocale();
}
public AccessibleAction getAccessibleAction() {
return new AccessAction();
}
}
// This class implements the AccessibleAction interface. Essentially, there
// is only one action that is the equivalent of pushing the button.
class AccessAction implements AccessibleAction {
final int NUMBER_OF_ACTIONS = 1;
final String DESCRIPTION = "Presses the button";
public int getAccessibleActionCount() {
return NUMBER_OF_ACTIONS;
}
public String getAccessibleActionDescription(int i) {
if (i == 0)
return (DESCRIPTION);
else
return null;
}
public boolean doAccessibleAction(int i) {
if (i == 0) {
// Simulate pressing a button
ActionExample.this.processActionEvent(new ActionEvent(this,
ActionEvent.ACTION_PERFORMED, ActionExample.this
.getActionCommand()));
return true;
} else
return false;
}
}
public static void main(String s[]) {
ActionExample example = new ActionExample();
JFrame frame = new JFrame("AccessibleAction Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(example, BorderLayout.CENTER);
frame.setSize(100, 100);
frame.setVisible(true);
}
}
Associating a Label with a Component
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Main {
public static void main(String[] argv) throws Exception {
JTextField component = new JTextField();
JLabel label = new JLabel("Name:");
label.setDisplayedMnemonic("N");
label.setLabelFor(component);
}
}
Has Displayed Name
import javax.swing.AbstractButton;
import javax.swing.JLabel;
import javax.swing.text.JTextComponent;
public class Util {
public static boolean hasDisplayedName(Class componentClass) {
return ((AbstractButton.class.isAssignableFrom(componentClass))
|| (JLabel.class.isAssignableFrom(componentClass))
|| (JTextComponent.class.isAssignableFrom(componentClass))
);
}
}
implement Accessible to make your object accessible
import java.awt.IllegalComponentStateException;
import java.util.Locale;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.accessibility.AccessibleStateSet;
public class Main implements Accessible {
public AccessibleContext getAccessibleContext() {
return new AccessibleContext() {
@Override
public AccessibleRole getAccessibleRole() {
return null;
}
@Override
public AccessibleStateSet getAccessibleStateSet() {
return null;
}
@Override
public int getAccessibleIndexInParent() {
return 0;
}
@Override
public int getAccessibleChildrenCount() {
return 0;
}
@Override
public Accessible getAccessibleChild(int i) {
return null;
}
@Override
public Locale getLocale() throws IllegalComponentStateException {
return null;
}
};
}
}
Setting a Description for Image Icons
import javax.swing.ImageIcon;
public class Main {
public static void main(String[] argv) throws Exception {
ImageIcon icon = new ImageIcon("image.gif");
icon.setDescription("Description of Image");
}
}
Setting a Keyboard Accelerator for a Menu Item
import java.awt.event.KeyEvent;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class Main {
public static void main(String[] argv) throws Exception {
JMenuItem item = new JMenuItem("Item");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.SHIFT_MASK));
}
}
Setting a Mnemonic for a Menu for Accessible
import javax.swing.JMenu;
public class Main {
public static void main(String[] argv) throws Exception {
JMenu menu = new JMenu("Menu");
menu.setMnemonic("M");
}
}
Setting a Mnemonic for Buttons for Accessible
import javax.swing.JButton;
import javax.swing.JCheckBox;
public class Main {
public static void main(String[] argv) throws Exception {
JButton button = new JButton("Button");
button.setMnemonic("B");
JCheckBox checkBox = new JCheckBox("CheckBox");
checkBox.setMnemonic("C");
}
}
Setting an Accessible Name for an Image Button
import javax.swing.ImageIcon;
import javax.swing.JButton;
public class Main {
public static void main(String[] argv) throws Exception {
JButton button = new JButton(new ImageIcon("image.gif"));
button.setToolTipText("Button Name");
button.getAccessibleContext().setAccessibleName("Button Name");
}
}