利用 Java AWT 的 Robot 類別與 MouseInfo,我們可以輕鬆實現「拾色器」功能:即時獲取滑鼠指標下的螢幕像素顏色。本文提供兩個完整範例:控制台版與 Swing GUI 版。
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();
}
}
}
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));
}
}
MouseInfo.getPointerInfo() 已自動處理多螢幕座標。robot.getPixelColor 直接對應邏輯像素;舊版本需注意縮放比例。getPixelColor 會消耗 CPU,建議間隔 50-100ms,或改用 JNI 呼叫系統 API(如 Windows GetPixel)。Java AWT 的 Robot 與 MouseInfo 提供了跨平台的螢幕像素讀取能力。配合 Swing/JavaFX,可快速構建實用的拾色器工具。注意執行緒安全與平台權限,即可穩定運行。