Mega Code Archive

 
Categories / Java / Swing Components
 

Mnemonic Tabbed Pane Example

// 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);       }     }   } }