2011-11-23 5 views
0

내 프로그램으로하고 싶은 것은 이미지를 클릭하면 JOptionPane과 함께 사각형이 나옵니다. 다만, JOptionPane가 유일한 것입니다.내 paintComponent가 작동하지 않는 이유는 무엇입니까?

나는 방법을 바꾸고 더 많은 수업을 추가했지만 아무 것도 효과가 없었습니다.> < 누군가 내 문제를 해결할 수 있습니까? 여기에 내 코드가있다.

다음은 내 사진을 선택할 수있는 파일 선택기라고합니다. 또한 레이블과 같은 여러 가지 요소가 여기에 있습니다.

public Help(){ 

     fc.setDialogTitle("Choose an image file to begin:"); 
     int returnval = fc.showOpenDialog(null); 
     if (returnval == JFileChooser.APPROVE_OPTION){ //when user selects a file, value returned will be JFileChooser.APPROVE_OPTION 
      File file = fc.getSelectedFile(); //the File value of the selection is returned from a call on getSelectedFile 
      try{ 
       image = ImageIO.read(file); //reads and loads File as image 
      } 
      catch (IOException e){} 
       System.out.println("You chose to open this file: " + file.getName()); 
     }else 
      System.out.println("No file selected."); 

     icon = new ImageIcon(image); 
     label = new JLabel(icon); 
     tagName = new JLabel(input); 

     label.addMouseListener(new ImagePanel()); 
     label.addMouseMotionListener(new ImagePanel()); 
     panel.add(tagName); 
    } 

마지막으로, 번거로운 paintComponent가 포함 된 ImagePanel 클래스입니다. 또한, 몇 가지 mouseListeners.

class ImagePanel extends JPanel implements MouseListener, MouseMotionListener{ 

     @Override 
     public void mouseClicked(MouseEvent event) { 
      // TODO Auto-generated method stub 

       x = event.getX(); 
       y = event.getY(); 

       input = JOptionPane.showInputDialog("Enter tag name"); 
       tagName.setText("You have tagged: " + input); 
       System.out.println(input); 
     } 

     @Override 
     public void mouseEntered(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mousePressed(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseReleased(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 

       if(image != null && isRectPresent){ 
        g.setColor(Color.DARK_GRAY); 
        g.drawRect(x-50, y-50, 100, 100); 
       } 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      // TODO Auto-generated method stub 
     } 
    } 

코드를 컴파일하고 직접 볼 수 있습니다. 당신이 무엇을해야하는지 안다면 나에게 머리를 줘라. 고마워.

+1

메모 :'@ Override' 주석을 추가하여 실제로 'paintComponent'를 대체해야합니다. 또한, 청취자 등을 추가하는 것과 같이'paintComponent'에서 * do * do * do *를하지 마십시오 ;-) – aioobe

+0

오버 라이딩은 무엇을할까요? 롤 나는 모든 xD에서 그것을 얻지 못한다 (나는 정말로 멍청이다.). 당신의 응답을 주셔서 감사합니다. – alicedimarco

+1

테스트 할 때 가능한 한 문제를 단순화하려고합니다. 모든 불필요한 메소드를 삭제하고, 단지'g.setColor();와 같이 매우 단순한'paintComponent'를 만듭니다. g.drawRect()'무조건. 우리에게 결과를 알려주십시오 – pajton

답변

1

하나의 메모 : 더 작은 예는 이전에 대답했을 것입니다. , super.paintComponent을 떠나 실험 할

int mx; 
int my; 

다른 것들 :

같은 마우스 이벤트의 x와 y 다른 이름 ImagePanel에서 자기 정의 필드에를 할당합니다. 은 또한 어쩌면 당신은 g에 대한 자세한 방법을 사용하려면 :

Graphics2D g2 = (Graphics2D)g; 

은 (기본 클래스의 x와 y에 할당하는 것은 좋은 방법이 아닙니다; 변경 좌표 같은 더 나은 사용 setBounds를.)

0
try{ 
     image = ImageIO.read(file); //reads and loads File as image 
    } 
    catch (IOException e){} 

여기서 코드는 "이미지를 읽으려고합니다. 예외가 발생하면 예외를 무시하고 문제를 무시하고 이미지없이 계속 진행하십시오." 무시하고 문제는 항상 나쁜 것입니다. 적어도 문제를 인쇄하고 계속할 수 있습니다.

try{ 
     image = ImageIO.read(file); //reads and loads File as image 
    } 
    catch (IOException e){ 
    e.printStackTrace();//print the exception 
    } 

또는 문제를 인쇄 중지 :

if(image != null && isRectPresent){ 
    g.setColor(Color.DARK_GRAY); 
    g.drawRect(x-50, y-50, 100, 100); 
} 

내가 문제가있는 경우 조건이 false이라고 생각이 (가 :

try{ 
     image = ImageIO.read(file); //reads and loads File as image 
    } 
    catch (IOException e){ 
    e.printStackTrace();//print the exception 
    System.exit(0);//stop executing 
    } 

실제 문제는 여기 가능성이 높습니다 이미지가 없습니다 (아마도 예외를 읽는 중 ...?) 및/또는 isRectPresent가 false입니다. 따라서 아무 것도하지 않습니다! if에 중단 점을 넣고 디버그 모드에서 프로그램을 실행 한 다음 imageisRectPresent 변수가이 지점에 도달하면 변수를 검사합니다. (거기에 도달하지 않으면 다른 문제가 있다는 것을 알게됩니다.) 행운을 빌어 요! 이상한 물건의

2

모든 종류의 : 새 인 JPanel를 작성해서는 안

label.addMouseListener(new ImagePanel()); 
label.addMouseMotionListener(new ImagePanel()); 

단지 구성 요소에 리스너를 추가합니다. 이미 패널의 인스턴스가 있습니다.

addMouseMotionListener(this); 

그림 메서드의 구성 요소에 수신기를 추가하지 마십시오. 페인팅 메서드가 호출되는 시점을 결코 제어 할 수 없으며 동일한 수신기가 여러 번 추가 될 수 있습니다.

+0

. 실제로 코드를 변경했습니다. 팁 주셔서 감사합니다 :) – alicedimarco

관련 문제