public class J_Frame_MouseLisenter extends MouseAdapter {
JFrame f; JButton red;
public J_Frame_MouseLisenter() {
f = new JFrame("鼠標事件");
f.setLayout(new FlowLayout());
red = new JButton("紅色");
red.addMouseListener(this);
f.add(red);
f.setVisible(true);
}
@Override public void mouseEntered(MouseEvent e) {
f.setBackground(Color.RED); // 無效果!
}
}
JFrame 的可視區域實際由 ContentPane (JRootPane → JLayeredPane → JContentPane) 組成。JFrame.setBackground() 設定的是 JFrame 本身(通常被 ContentPane 遮蓋),看不到效果。
// 方式 1:設定 ContentPane (推薦)
f.getContentPane().setBackground(Color.RED);
// 方式 2:在 mouseClicked 等事件中設定
@Override public void mouseClicked(MouseEvent e) {
f.getContentPane().setBackground(Color.BLUE);
red.setBackground(Color.RED); // 按鈕自身背景
}
| 事件 | 觸發條件 | 適用場景 |
|---|---|---|
mouseEntered | 滑鼠進入元件範圍 | 懸停提示、ToolTip |
mouseExited | 滑鼠離開元件範圍 | 恢復狀態 |
mousePressed | 按下滑鼠鍵 | 拖曳開始、按下特效 |
mouseReleased | 釋放滑鼠鍵 | 點擊完成、拖曳結束 |
mouseClicked | 完整點擊 (Pressed+Released 同元件) | 按鈕動作、選單觸發 |
原碼用 mouseEntered 卻意圖點擊變色,建議改用 mouseClicked。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MouseListenerDemo extends MouseAdapter {
JFrame frame;
JButton btnRed, btnBlue, btnYellow;
public MouseListenerDemo() {
frame = new JFrame("Mouse Listener Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
btnRed = new JButton("紅色背景");
btnBlue = new JButton("藍色背景");
btnYellow = new JButton("黃色背景");
for (JButton b : new JButton[]{btnRed, btnBlue, btnYellow}) {
b.addMouseListener(this);
frame.add(b);
}
frame.setVisible(true);
}
@Override public void mouseClicked(MouseEvent e) {
JButton src = (JButton) e.getSource();
Color c = switch (src.getText()) {
case "紅色背景" -> Color.RED;
case "藍色背景" -> Color.BLUE;
default -> Color.YELLOW;
};
frame.getContentPane().setBackground(c);
src.setBackground(c.brighter());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(MouseListenerDemo::new);
}
}
JFrame.setBackground() 無效 → 改用 getContentPane().setBackground()。SwingUtilities.invokeLater()。mouseClicked/mousePressed/mouseEntered。setDefaultCloseOperation → 關閉視窗程式不結束。