2013-08-26 3 views
0

다음과 같은 의심이 있습니다 : mouselistener가있는 구성 요소의 한계에서 "마우스 왼쪽 클릭 이벤트"를 가져올 수 있습니까? 아니면 다른 접근법으로 시도해야합니까?자바 - JPanel의 한계를 클릭하십시오

내 문제는 다음과 같습니다. 내 프로젝트에 적합한 WYSIWYG 패널을 만들고 있습니다. 이 패널은 사용자 선택에 따라로드 된 이미지를 표시하는 다른 패널에 대한 형제입니다. 예를 들어이 이미지의 배경색을 가져와야합니다. 어떤 색상을 클릭하면 WYSIWYG 패널의 bgcolor가 변경됩니다. Robot 클래스를 사용하여 픽셀의 색상을 가져 오지만이 방법은 이미지와 색상 선택기가 같은 패널에 있지만 작동하지 않는 경우에만 작동합니다.

업데이트 :이 코드는 무엇을 의미합니다. 메인 프레임에는 2 개의 독립적 인 JFrames가 있습니다. 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);  

     } 


    } 

}   
+2

는 다음 네, 그것은 가능하다. 두 번째'JPanel'에 대해 동일한 논리를 적용하기 만하면됩니다. 정확히 어떻게 할 것인지는 실제로 코드를 보지 않고 신비입니다. 작고 짧고 정확하고 편집 가능한 예를 하나만 제공하십시오. [SSCCE] (http://sscce.org/) :-) –

+2

작업을 클릭 할 패널에 리스너를 추가하는 것이 아니라 ? 그것은 당신이 클릭하지 않는 패널에 놓는 것보다 더 합리적입니다. – Cruncher

+2

'Robot' 클래스를 사용하는 이유는 무엇입니까? 이미지를로드하고 있으므로 이미지의 색상을 직접 가져올 수 없습니까? 관련 코드 –

답변

2

당신은 색상을 결정하기 위해 바탕 화면의 패치를 캡처 Robot를 사용 ZoomgetRGB()에서 무엇이 가능한지의 아이디어를 얻을 수 있습니다. 캡처하려면 클릭하고 드래그하십시오. 마우스를 가져 가면 픽셀의 RGB 구성 요소가 포함 된 툴팁을 볼 수 있습니다. 우려가 응용 프로그램의 크기 내에서 마우스 클릭 인 경우

image