0

次の疑問があります。マウスリスナーを使用して、コンポーネントの制限を超えて「マウスの左クリックイベント」を取得することは可能ですか? または、別のアプローチでこれを試す必要がありますか?

私の問題は次のとおりです。プロジェクトに適した WYSIWYG パネルを作成しています。このパネルは、ユーザーの選択に従ってロードされた画像を表示する別のパネルの兄弟です。たとえば、この画像の背景色を取得する必要があります。任意の色をクリックすると、WYSIWYG パネルの bgcolor が変更されます。クラスを使用しRobotてピクセルの色を取得していますが、これは画像とカラーセレクターが同じパネルにある場合にのみ機能しますが、そうではありません。

更新: このコードは、私が意味するものです。メインフレームには 2 つの独立した JFrame があります。MouseColorPane をクリックして、ImageLoader 上の画像の RGB カラーを取得する必要があります。この場合、ロボットは 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);       

        }


    }

}        
4

1 に答える 1