首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 實現螢幕取色器:Robot 類實戰與 GUI 互動完整範例

     編輯:Java 程式設計入門

前言

利用 Java AWT 的 Robot 類別與 MouseInfo,我們可以輕鬆實現「拾色器」功能:即時獲取滑鼠指標下的螢幕像素顏色。本文提供兩個完整範例:控制台版與 Swing GUI 版。

核心 API 速查

  • Robot robot = new Robot(); —— 建立機器人實例(需捕獲 AWTException)。
  • Point p = MouseInfo.getPointerInfo().getLocation(); —— 獲取滑鼠全螢幕座標。
  • Color c = robot.getPixelColor(p.x, p.y); —— 取得該座標的 RGB 顏色。

範例一:控制台版取色器

import java.awt.*;
import java.awt.event.InputEvent;

public class PickColor {
    public static void main(String[] args) {
        new PickColor().pickAndPrint();
    }

    public void pickAndPrint() {
        try {
            Robot robot = new Robot();
            // 給使用者 3 秒移動滑鼠到目標位置
            System.out.println("3 秒後取色,請將滑鼠移至目標位置...");
            Thread.sleep(3000);

            Point pt = MouseInfo.getPointerInfo().getLocation();
            Color color = robot.getPixelColor(pt.x, pt.y);

            System.out.printf("座標: (%d, %d)%n", pt.x, pt.y);
            System.out.printf("顏色: R=%d, G=%d, B=%d%n", color.getRed(), color.getGreen(), color.getBlue());
            System.out.printf("Hex: #%02X%02X%02X%n", color.getRed(), color.getGreen(), color.getBlue());
        } catch (AWTException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

範例二:Swing GUI 即時取色器(背景色同步顯示)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PickColorGUI extends JFrame {
    private final JPanel colorPanel = new JPanel();
    private final JLabel infoLabel = new JLabel("移動滑鼠即時取色", SwingConstants.CENTER);
    private volatile boolean running = true;

    public PickColorGUI() {
        super("Java 拾色器");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300, 200);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());

        colorPanel.setPreferredSize(new Dimension(300, 150));
        colorPanel.setBorder(BorderFactory.createTitledBorder("當前顏色"));
        add(colorPanel, BorderLayout.CENTER);
        add(infoLabel, BorderLayout.SOUTH);

        // 啟動取色執行緒
        new Thread(this::colorLoop, "ColorPicker").start();

        // 視窗關閉時停止執行緒
        addWindowListener(new WindowAdapter() {
            @Override public void windowClosing(WindowEvent e) { running = false; }
        });
    }

    private void colorLoop() {
        Robot robot;
        try { robot = new Robot(); }
        catch (AWTException e) { e.printStackTrace(); return; }

        while (running) {
            try {
                Point pt = MouseInfo.getPointerInfo().getLocation();
                Color c = robot.getPixelColor(pt.x, pt.y);

                // Swing 元件更新必須在 EDT
                SwingUtilities.invokeLater(() -> {
                    colorPanel.setBackground(c);
                    infoLabel.setText(String.format("座標:(%d,%d)  RGB:(%d,%d,%d)  #%02X%02X%02X",
                            pt.x, pt.y, c.getRed(), c.getGreen(), c.getBlue(),
                            c.getRed(), c.getGreen(), c.getBlue()));
                });
                Thread.sleep(50); // 20 FPS,降低 CPU 佔用
            } catch (InterruptedException ignored) { break; }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new PickColorGUI().setVisible(true));
    }
}

進階優化建議

  1. 多螢幕支援:MouseInfo.getPointerInfo() 已自動處理多螢幕座標。
  2. 高 DPI 縮放:Java 9+ 可用 robot.getPixelColor 直接對應邏輯像素;舊版本需注意縮放比例。
  3. 效能**:頻繁呼叫 getPixelColor 會消耗 CPU,建議間隔 50-100ms,或改用 JNI 呼叫系統 API(如 Windows GetPixel)。
  4. 權限問題**:某些系統(macOS、Linux Wayland)需授予「螢幕錄製」或「無障礙」權限才能讀取全螢幕像素。

應用場景延伸

  • 自動化測試:驗證 UI 顏色一致性。
  • 設計師工具:快速取色生成調色盤。
  • 遊戲輔助:偵測特定顏色觸發腳本(需遵守遊戲規則)。

結語

Java AWT 的 Robot 與 MouseInfo 提供了跨平台的螢幕像素讀取能力。配合 Swing/JavaFX,可快速構建實用的拾色器工具。注意執行緒安全與平台權限,即可穩定運行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved