次の疑問があります。マウスリスナーを使用して、コンポーネントの制限を超えて「マウスの左クリックイベント」を取得することは可能ですか? または、別のアプローチでこれを試す必要がありますか?
私の問題は次のとおりです。プロジェクトに適した 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);
}
}
}