2015-01-30 3 views
2

이미지 위에 격자를 배치하고 싶습니다. 이미지가 paintComponent 메서드를 사용하여 이미지를 보유하는 JLabel을 사용했습니다.이 이미지는 내 프로젝트의 다른 단계에서 변경 될 것이므로 JLayer 클래스 GridDrawer extends LayerUI은 그리드를 만드는 데 도움이됩니다. 작은 예제에서는 drawRect() 만 사용했습니다. 방법).JLayer를 사용하여 이미지 위에 격자 배치

내 코드 :

GridPhoto (메인) 클래스 :

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package gridphoto; 

import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.SwingUtilities; 

/** 
* 
* @author VJ 
*/ 
public class GridPhoto { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new GUI(); 
       } catch (IOException ex) { 
        Logger.getLogger(GridPhoto.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

     }); 
    } 

} 

GUI 클래스 :

package gridphoto; 

    import java.awt.image.BufferedImage; 
    import java.awt.BorderLayout; 
    import java.awt.Graphics; 
    import java.io.File; 
    import java.io.IOException; 
    import javax.imageio.ImageIO; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.JLayer; 
    import javax.swing.plaf.LayerUI; 

    public class GUI { 
    JFrame frame; 
    JPanel panel; 
    JLayer<JLabel> GridLayer; 
    JLabel imagelabel; 
    LayerUI<JLabel> GridUI; 
    BufferedImage img; 

    public GUI() throws IOException { 
     frame = new JFrame("GridImage Test"); 
     panel = new JPanel(); 
     img = ImageIO.read(new File("/Users/VJ/Desktop/gs.png")); 
     imagelabel = new JLabel() { 
      public void paintComponent(Graphics g) { 
       g.drawImage(img.getScaledInstance(500, 500, BOTTOM), 0, 0, null); 
      } 
     }; 
     GridUI = new GridDrawer(); 
     GridLayer = new JLayer(imagelabel, GridUI); 
     panel.setLayout(new BorderLayout()); 
     frame.setLayout(new BorderLayout()); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500, 700); 
    panel.add(GridLayer); 
     frame.add(panel); 
     frame.setVisible(true); 

    } 

    public class GridDrawer extends LayerUI<JLabel> { 

     public void paintComponent(Graphics g) { 
      g.drawRect(0, 0, 250, 250); 
     } 

    } 

} 

내 문제는 심지어 그것은 단지 이미지를 표시 JLayerJPanel에 추가 한 후와 그리드가 아니야. 예를 들어 paintComponentGridDrawer 클래스의 메서드는 Rectangle 만 그립니다.

코드에 무엇이 잘못되었거나 을 사용하여 Image에 표를 배치하는 것 외에 다른 방법이 있습니까?

출력.

+0

1) 더 나은 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve) (최소한의 완전한 검증 가능한 예) 또는 [SSCCE] (http://www.sscce.org/) (짧은, 자체 포함, 올바른 예). 이 코드는 화면에 'complete'가되도록 'main (String [])'코드가 필요합니다. 2)이 예제의 이미지를 얻는 한 가지 방법은 [이 Q & A] (http://stackoverflow.com/q/19209650/418556)에서 볼 수있는 이미지로 핫 링크하는 것입니다. –

답변

2

LayerUI에는 paintComponent(...) 메서드가 없습니다.

@Override 
public void paint(...) 

을하고 (...) super.paint를 호출하는 것을 잊지 마세요 :

당신이 메소드를 오버라이드 (override) 할 때마다

당신은 그래서 당신은 당신이 올바른 방법을 재정의 알고 @Override를 사용하십시오.

자세한 내용 및 작동 예제는 How to Decorate Components With JLayer Class의 스윙 튜토리얼을 참조하십시오.

+0

예, 그것에 대해 알고, 미안하지만, 심지어 페인트() 메서드를 사용하여 아무것도하지 않습니다. –

+0

@ JaymitDesai, 자습서의 작업 예제에서 찾은 코드와 다른 코드는 무엇입니까? 사람들이 테스트 할 수 있도록 클래스를 실행하기위한 main() 메소드를 포함하여 업데이트 된 코드를 게시하십시오. – camickr

+0

main 메소드를 가지는 클래스를 추가했습니다. –