首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Swing 滑鼠監聽器失效:JFrame 背景顏色不變的正確設定方式

     編輯:程式設計綜合問答

問題程式碼

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()。
  • 未在 EDT (Event Dispatch Thread) 建立 UI → 用 SwingUtilities.invokeLater()。
  • 事件選擇錯誤 → 依需求選 mouseClicked/mousePressed/mouseEntered。
  • 未設定 setDefaultCloseOperation → 關閉視窗程式不結束。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved