// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
/* (swing1.1.1beta2) */
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Hashtable;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicGraphicsUtils;
import javax.swing.plaf.metal.MetalTabbedPaneUI;
/**
* @version 1.1 06/02/99
*/
public class MnemonicTabbedPaneExample extends JPanel {
public MnemonicTabbedPaneExample() {
setLayout(new BorderLayout());
MnemonicTabbedPane tabbedPane = new MnemonicTabbedPane();
String[] tabs = { "Zero", "One", "Two", "Three", "Four" };
char[] ms = { 'Z', 'O', 'T', 'h', 'F' };
int[] keys = { KeyEvent.VK_0, KeyEvent.VK_1, KeyEvent.VK_2,
KeyEvent.VK_3, KeyEvent.VK_4, };
for (int i = 0; i < tabs.length; i++) {
tabbedPane.addTab(tabs[i], createPane(tabs[i]));
tabbedPane.setMnemonicAt(i, ms[i]);
//tabbedPane.setMnemonicAt(i, keys[i]);
}
tabbedPane.setSelectedIndex(0);
add(tabbedPane, BorderLayout.CENTER);
add(new JButton("button"), BorderLayout.SOUTH);
}
JPanel createPane(final String s) {
JButton abcButton = new JButton("Abc");
abcButton.setMnemonic('A');
JButton xyzButton = new JButton("Xyz");
xyzButton.setMnemonic('X');
JPanel p = new JPanel();
p.add(new JLabel(s));
p.add(abcButton);
p.add(xyzButton);
return p;
}
public static void main(String[] args) {
JFrame frame = new JFrame("TabbedPane Test");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(new MnemonicTabbedPaneExample());
frame.setSize(250, 130);
frame.setVisible(true);
}
}
class MnemonicTabbedPane extends JTabbedPane {
Hashtable mnemonics = null;
int condition;
public MnemonicTabbedPane() {
setUI(new MnemonicTabbedPaneUI());
mnemonics = new Hashtable();
// I don't know which one is more suitable for mnemonic action.
//setMnemonicCondition(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
setMnemonicCondition(WHEN_IN_FOCUSED_WINDOW);
}
public void setMnemonicAt(int index, char c) {
int key = (int) c;
if ('a' <= key && key <= 'z') {
key -= ('a' - 'A');
}
setMnemonicAt(index, key);
}
public void setMnemonicAt(int index, int keyCode) {
ActionListener action = new MnemonicAction(index);
KeyStroke stroke = KeyStroke
.getKeyStroke(keyCode, ActionEvent.ALT_MASK);
registerKeyboardAction(action, stroke, condition);
mnemonics.put(new Integer(index), new Integer(keyCode));
}
public int getMnemonicAt(int index) {
int keyCode = 0;
Integer m = (Integer) mnemonics.get(new Integer(index));
if (m != null) {
keyCode = m.intValue();
}
return keyCode;
}
public void setMnemonicCondition(int condition) {
this.condition = condition;
}
public int getMnemonicCondition() {
return condition;
}
class MnemonicAction implements ActionListener {
int index;
public MnemonicAction(int index) {
this.index = index;
}
public void actionPerformed(ActionEvent e) {
MnemonicTabbedPane tabbedPane = (MnemonicTabbedPane) e.getSource();
tabbedPane.setSelectedIndex(index);
tabbedPane.requestFocus();
}
}
class MnemonicTabbedPaneUI extends MetalTabbedPaneUI {
protected void paintText(Graphics g, int tabPlacement, Font font,
FontMetrics metrics, int tabIndex, String title,
Rectangle textRect, boolean isSelected) {
g.setFont(font);
MnemonicTabbedPane mtabPane = (MnemonicTabbedPane) tabPane;
if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex)) {
g.setColor(tabPane.getForegroundAt(tabIndex));
BasicGraphicsUtils.drawString(g, title, mtabPane
.getMnemonicAt(tabIndex), textRect.x, textRect.y
+ metrics.getAscent());
} else {
g.setColor(tabPane.getBackgroundAt(tabIndex).brighter());
BasicGraphicsUtils.drawString(g, title, mtabPane
.getMnemonicAt(tabIndex), textRect.x, textRect.y
+ metrics.getAscent());
g.setColor(tabPane.getBackgroundAt(tabIndex).darker());
BasicGraphicsUtils.drawString(g, title, mtabPane
.getMnemonicAt(tabIndex), textRect.x - 1, textRect.y
+ metrics.getAscent() - 1);
}
}
}
}
|