Java - 突破 JPanel 的限制

标签 java swing mouselistener awtrobot

我有以下疑问: 是否可以使用鼠标监听器将“鼠标左键单击事件”超出组件的限制?或者我应该用另一种方法尝试这个?

我的问题如下。我正在创建一个适合我的项目的所见即所得面板。 该面板与另一个面板是同级的,后者显示根据用户选择加载的图像。例如,我需要获取该图像的背景颜色。单击任何颜色时,都会更改所见即所得面板的背景颜色。 我正在使用 Robot 类来获取像素的颜色,但这仅在图像和颜色选择器位于同一面板中时才有效,但它们不会。

更新:这段代码就是我的意思。主机有两个独立的JFrame。我需要通过单击 MouseColorPane 来获取 ImageLoader 上图像的 RGB 颜色。在这种情况下,Robot 只能获取 JLabel 的黑色边框。

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class WhatsMyColor {

    public static void main(String[] args) throws IOException {
        new WhatsMyColor();
    }

    public WhatsMyColor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    final MouseColorPane mcp = new MouseColorPane();
                    frame.add(mcp,BorderLayout.CENTER);

                    ImageLoader il = new ImageLoader();
                    frame.add(il,BorderLayout.NORTH);
                    frame.setSize(800, 400);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);

                } catch (Exception exp) {
                    exp.printStackTrace();
                }

            }
        });
    }

    public class ImageLoader extends JPanel {

        ImageLoader(){
            BufferedImage img = null;
            try {img = ImageIO.read(new File("src/monkey-icon128.png"));} catch (IOException e1) {e1.printStackTrace();}
            add(new JLabel (new ImageIcon (img)));
            BufferedImage img2 = null;
            try {img2 = ImageIO.read(new File("src/monkey-icon128.png"));} catch (IOException e1) {e1.printStackTrace();}
            add(new JLabel (new ImageIcon (img2)));
        }
    }

    public class MouseColorPane extends JPanel {

        private Robot robot;
        private JLabel color;

        public MouseColorPane() throws AWTException {


            setLayout(new GridBagLayout());

            color = new JLabel();
            color.setBorder(BorderFactory.createLineBorder(Color.black));
            color.setPreferredSize(new Dimension(100,100));
            color.setFocusable(false);
            color.setOpaque(true);
            color.setFocusTraversalPolicyProvider(false);
            color.addMouseListener(new MouseListener() {
                @Override
                public void mouseReleased(MouseEvent arg0) {}
                @Override
                public void mousePressed(MouseEvent arg0) {}
                @Override
                public void mouseExited(MouseEvent arg0) {}
                @Override
                public void mouseEntered(MouseEvent arg0) {}
                @Override
                public void mouseClicked(MouseEvent arg0) {
                    // TODO Auto-generated method stub
                    PointerInfo pi;
                    pi = MouseInfo.getPointerInfo();
                    updateColor(pi.getLocation());
                }
            });
            add(color);

            robot = new Robot();
            setVisible(true);

        }

        protected void updateColor(Point p) {
            Color pixelColor = robot.getPixelColor(p.x, p.y);
            color.setBackground(pixelColor);       

        }


    }

}        

最佳答案

您可以从 Zoom 了解到什么是可能的,它使用 Robot 捕获桌面的补丁并使用 getRGB() 来确定颜色。单击并拖动即可捕获;将鼠标悬停在上面即可查看包含像素 RGB 分量的工具提示。

image

关于Java - 突破 JPanel 的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18448659/

相关文章:

java - 客户端无法从服务器接收UDP数据报

java - 需要有关此逻辑的帮助

java - 液体布局..使按钮向右浮动

java - JFileChooser 关闭启动新窗口

Java MouseEvent,检查是否按下

java - 形状未绘制在正确的位置,在其他位置绘制 20-40 像素(使用 MouseListener)

Java 倒计时与线程

java - 使用 Java 裁剪图像

java - 使用 Java Swing 计算并显示文本框中的字符数

java - 如何知道是否在图形对象上单击