Swing 提供兩種鍵盤快捷機制:Mnemonic(助記符) 與 Accelerator(加速鍵)。前者用於標籤/按鈕文字下劃線字母,配合 Alt 聚焦關聯組件;後者用於選單項直接觸發動作,支援任意修飾鍵組合。本文通過完整範例演示 Mnemonic 核心 API 用法。
JTextField firstField = new JTextField(10);
JLabel firstLabel = new JLabel("First Name", JLabel.RIGHT);
firstLabel.setDisplayedMnemonic('F'); // 指定助記符字母
firstLabel.setLabelFor(firstField); // 關聯目標組件:按 Alt+F 聚焦 firstField
「Middle Initial」有兩個 'I',預設下劃第一個。JDK 1.4+ 提供:
JLabel middleLabel = new JLabel("Middle Initial", JLabel.RIGHT);
middleLabel.setDisplayedMnemonic('I');
middleLabel.setDisplayedMnemonicIndex(7); // 指定第 7 個字元(從 0 計)下劃線
middleLabel.setLabelFor(middleField);
import javax.swing.*;
import java.awt.*;
public class MnemonicLabels {
public static void main(String[] args) {
JTextField firstField = new JTextField(10);
JTextField middleField = new JTextField(10);
JTextField lastField = new JTextField(10);
JLabel firstLabel = new JLabel("First Name", JLabel.RIGHT);
firstLabel.setDisplayedMnemonic('F');
firstLabel.setLabelFor(firstField);
JLabel middleLabel = new JLabel("Middle Initial", JLabel.RIGHT);
middleLabel.setDisplayedMnemonic('I');
middleLabel.setDisplayedMnemonicIndex(7); // JDK 1.4+
middleLabel.setLabelFor(middleField);
JLabel lastLabel = new JLabel("Last Name", JLabel.RIGHT);
lastLabel.setDisplayedMnemonic('L');
lastLabel.setLabelFor(lastField);
JPanel p = new JPanel(new GridLayout(3, 2, 5, 5));
p.add(firstLabel); p.add(firstField);
p.add(middleLabel); p.add(middleField);
p.add(lastLabel); p.add(lastField);
JFrame f = new JFrame("MnemonicLabels");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(p);
f.pack();
f.setVisible(true);
}
}

編譯執行後,分別按 Alt+F、Alt+I、Alt+L,焦點將在三個文字欄位間切換。標籤對應字母會顯示下劃線(Windows/Linux 下明顯,Mac 霻看 L&F 支援)。
| 特性 | Mnemonic (助記符) | Accelerator (加速鍵) |
|---|---|---|
| 適用對象 | JLabel、JButton、JCheckBox 等有文字的組件 | JMenuItem、Action |
| 觸發方式 | Alt + 指定字母 | 可配置任意組合(Ctrl+S、F5 等) |
| 行為 | 將焦點移至 setLabelFor 指定組件 | 直接觸發 actionPerformed |
| API | setDisplayedMnemonic(char)setLabelFor(Component) | setAccelerator(KeyStroke) |
JMenuItem saveItem = new JMenuItem("Save");
saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
saveItem.addActionListener(e -> save());
善用 Mnemonic 提升表單操作效率,用 Accelerator 加速選單操作,兩者互補構建鍵盤友好介面。