本例展示 JButton 的進階功能,包含圖示與文字排版、助鍵設定、動作指令、啟用/停用狀態切換、工具提示,以及透過 ActionListener 實作按鈕間的互動邏輯。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonDemo extends JPanel implements ActionListener {
protected JButton btnDisable, btnMiddle, btnEnable;
public ButtonDemo() {
// 載入圖示(需確保 images/ 目錄下有對應檔案)
ImageIcon leftIcon = createImageIcon("images/right.gif");
ImageIcon midIcon = createImageIcon("images/middle.gif");
ImageIcon rightIcon = createImageIcon("images/left.gif");
// 按鈕 1:停用中間按鈕
btnDisable = new JButton("停用中間按鈕(D)", leftIcon);
btnDisable.setVerticalTextPosition(AbstractButton.CENTER);
btnDisable.setHorizontalTextPosition(AbstractButton.LEADING);
btnDisable.setMnemonic(KeyEvent.VK_D); // Alt+D
btnDisable.setActionCommand("disable");
// 按鈕 2:中間按鈕(預設啟用)
btnMiddle = new JButton("M中間按鈕", midIcon);
btnMiddle.setVerticalTextPosition(AbstractButton.BOTTOM);
btnMiddle.setHorizontalTextPosition(AbstractButton.CENTER);
btnMiddle.setMnemonic(KeyEvent.VK_M); // Alt+M
// 按鈕 3:啟用中間按鈕(預設停用)
btnEnable = new JButton("E啟用中間按鈕", rightIcon);
btnEnable.setMnemonic(KeyEvent.VK_E); // Alt+E
btnEnable.setActionCommand("enable");
btnEnable.setEnabled(false);
// 註冊事件監聽器
btnDisable.addActionListener(this);
btnEnable.addActionListener(this);
// 設定工具提示
btnDisable.setToolTipText("點擊此按鈕,將使中間按鈕失效!");
btnMiddle.setToolTipText("點擊此按鈕,不會觸發任何事件!");
btnEnable.setToolTipText("點擊此按鈕,將使中間按鈕啟用");
// 加入面板
add(btnDisable);
add(btnMiddle);
add(btnEnable);
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("disable".equals(cmd)) {
btnMiddle.setEnabled(false);
btnDisable.setEnabled(false);
btnEnable.setEnabled(true);
} else { // "enable"
btnMiddle.setEnabled(true);
btnDisable.setEnabled(true);
btnEnable.setEnabled(false);
}
}
// 載入圖示的輔助方法
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = ButtonDemo.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("找不到圖示檔案:" + path);
return null;
}
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("ButtonDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ButtonDemo panel = new ButtonDemo();
panel.setOpaque(true);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
}
| 功能 | 方法/屬性 | 說明 |
|---|---|---|
| 圖示與文字相對位置 | setVerticalTextPosition(), setHorizontalTextPosition() | 控制圖示相對文字的垂直/水平位置(TOP, CENTER, BOTTOM / LEFT, CENTER, RIGHT, LEADING, TRAILING) |
| 助鍵 | setMnemonic(int keyCode) | 設定 Alt+鍵 快速鍵,需配合字母大寫常數(KeyEvent.VK_*) |
| 動作指令 | setActionCommand(String) | 為按鈕指定識別字串,事件處理時透過 e.getActionCommand() 判斷來源 |
| 啟用狀態 | setEnabled(boolean) | 動態控制按鈕是否可互動,停用時外觀會變灰且不觸發事件 |
| 工具提示 | setToolTipText(String) | 滑鼠懸停時顯示說明文字 |
| 事件處理 | implements ActionListener | 面板類別實作介面,統一處理多個按鈕事件 |
Class.getResource() 載入圖示,支援 JAR 內資源存取,避免路徑問題。ActionCommand 區分來源,集中在 actionPerformed 中處理。ActionListener,避免匿名內部類別過多,適合簡單 UI 邏輯。