2013-06-20 2 views
0

"다음"및 "이전"JButton을 사용하여 볼 수있는 작은 이미지 갤러리가 있습니다. 그것은 올바르게 작동합니다.JPanel의 이미지에 직사각형을 인쇄하십시오.

내가하고 싶은 것은 이미지를 클릭 할 때 표시되는 사각형에 (채우기가없는 프레임 만) 페인트하는 것입니다. 예를 들어 포인트 (230,150)를 클릭하면, 그 rect 왼쪽 아래 각도로 rect가 나타나길 원합니다.

내 코드는, 나는 많은 일을 해봤 않고 아무 일하지 :

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.Rectangle2D; 
import java.awt.Image; 

public class rectOnGallery extends JFrame{ 

private static final long serialVersionUID = 1L; 

private ImageIcon myImage1; 
private ImageIcon myImage2; 
private ImageIcon myImage3; 
private ImageIcon myImage4; 
JPanel ImageGallery = new JPanel(); 
private ImageIcon[] myImages = new ImageIcon[4]; 
private int curImageIndex=0; 

int width; 
int height; 

public rectOnGallery(){ 

    double scale = 0.666667; 
    width = (int) (scale * 612); 
    height = (int) (scale * 792); 

    myImage1 = new ImageIcon(((new ImageIcon("NewSign1.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH)); 
    myImage2 = new ImageIcon(((new ImageIcon("pdf2.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH)); 
    myImage3 = new ImageIcon(((new ImageIcon("pdfimg.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH)); 
    myImage4 = new ImageIcon(((new ImageIcon("images.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH)); 

    ImageGallery.add(new JLabel (myImage1)); 
    myImages[0]=myImage1; 
    myImages[1]=myImage2; 
    myImages[2]=myImage3; 
    myImages[3]=myImage4; 


    ImageGallery.addMouseListener(new MouseAdapter() { 

     public void mouseClicked(MouseEvent evt) { 
       if (myImages[curImageIndex] != null) { 
       double x = (getWidth() - width)/2; 
       double y = (getHeight() - height)/2; 
       Rectangle2D.Double bounds = new Rectangle2D.Double(x, y, width, height); 
       if (bounds.contains(evt.getPoint())) { 
        System.out.println("You clicked on " + evt.getX() + " x " + evt.getY()); 

       **** HERE GOES SOMETHING THAT WRITES THE FRAME IN THE 
       **** POSITION (ent.getX() , evt.getY()) 

       } 
       } 
     } 
    }); 

    add(ImageGallery, BorderLayout.NORTH); 

    JButton PREVIOUS = new JButton ("Previous"); 
    JButton NEXT = new JButton ("Next"); 

    JPanel buttons = new JPanel(); 
    buttons.setLayout(new GridLayout(1,4)); 
    buttons.add(PREVIOUS); 
    buttons.add(NEXT); 

    add(buttons, BorderLayout.SOUTH); 

    //register listener 
    PreviousButtonListener PreviousButton = new PreviousButtonListener(); 
    NextButtonListener NextButton = new NextButtonListener(); 

    //add listeners to corresponding componenets 
    PREVIOUS.addActionListener(PreviousButton); 
    NEXT.addActionListener(NextButton); 
} 

private class PreviousButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e){ 

     if(curImageIndex>0 && curImageIndex <= 3){    
      ImageGallery.remove(0); 
      curImageIndex -- ; 
      ImageIcon TheImage= myImages[curImageIndex]; 
      ImageGallery.add(new JLabel (TheImage)); 
      ImageGallery.validate(); 
      ImageGallery.repaint(); 
     } 
     else{ 
      ImageGallery.remove(0); 
      ImageGallery.add(new JLabel (myImage1)); 
      curImageIndex=0; 
      ImageGallery.validate(); 
      ImageGallery.repaint(); 
     } 
    } 
} 

private class NextButtonListener implements ActionListener { 

    public void actionPerformed(ActionEvent e){ 

     if(curImageIndex>=0 && curImageIndex < 3){ 
      ImageGallery.remove(0); 
      curImageIndex ++ ; 
      ImageIcon TheImage= myImages[curImageIndex]; 
      ImageGallery.add(new JLabel (TheImage)); 

      ImageGallery.validate(); 
      ImageGallery.repaint(); 
     } 
     else{ 
      ImageGallery.remove(0); 
      ImageGallery.add(new JLabel (myImage4)); 
      curImageIndex=3; 
      ImageGallery.validate(); 
      ImageGallery.repaint(); 
     } 
    } 
} 

public static void main (String [] args){ 

    provaPosFirma frame = new provaPosFirma(); 

    frame.setSize(500, 600); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
} 
} 

을 나는 또한 다른 이미지에 사각형의 이미지를 페인트 tryed 한 대안 일하지만이 neighter 일 .

내가 잘못하고있는 것을 알고 있으며, 그게 더 쉽다는 것을 알고 있지만, 나는 이것을 이해하지 못하고있다. 어쨌든 당신이 한 번 표시됩니다 rect 또는 다른 직사각형 이미지를 그려 도움이 될 수 있다면.

+2

표준 Java 명명 규칙을 따르십시오. 변수 이름은 대문자로 시작하면 안됩니다. 구성 요소 추가/제거를 계속하지 마십시오. setIcon (...) 메서드를 사용하여 표시된 이미지를 변경하면됩니다. – camickr

+0

@camickr 팁 주셔서 감사합니다. setIcon()에 대해 알고 있지만 이미지가 완전히 바뀌고 다른 이미지가 이전에 인쇄되지 않습니다. – Igr

답변

3

이 작업을 수행하려면 인 JPanel의 사용자 지정 하위 클래스를 만들 수 있습니다 미리 감사드립니다, 대신 사용 "ImageGallery." 그런 다음 해당 클래스에서 paintComponent 메서드를 재정 의하여 원하는 사각형을 그립니다. 따라서 코드는 다음과 같습니다.

class ImageGalleryPanel extends JPanel{ 
    private Point rectPosition = null; 
    private Dimension rectSize; //Set the size of the rect 

    public void setRectPosition(Point p){ 
     rectPosition = p; 
    } 

    private void drawRect(Graphics g){ 
     if(rectPosition != null){ 
      g.drawRect(rectPosition.x, rectPosition.y, rectSize.width, rectSize.height); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     drawRect(g); 
    } 
} 

JPanel "ImageGallery"를이 클래스로 바꾸고 그릴 사각형의 크기를 지정하십시오.

ImageGallery.setRectPosition(evt.getPoint()); 
ImageGallery.repaint(); 

나는이 코드를 테스트하지 않았다, 그래서 오타가있을 수 있습니다,하지만 그건 인 JPanel에 그릴 때 원하는 기본 아이디어 - 당신이 사각형을 그릴 수 귀하의 코멘트를하는 경우, 다음 줄을 추가합니다. 패널의 paint 메소드를 오버라이드 (override)합니다. 그런 다음 그릴 때 그 속성을 원하는대로 변경하고 repaint()를 호출하십시오. 직접 그려보기 만하면 다시 칠하는 메서드가 자동으로 호출되어 변경 한 내용을 덮어 씁니다.

편집 - 이미지가 rect 위에 그려지는 것을 피하기 위해 할 수있는 일이 몇 가지 있습니다. paintComponent 메소드를 "paint"또는 "paintChildren"으로 변경하고 super.paintComponent 함수 호출을 일치하도록 변경할 수 있습니다. 이것은 빠르고 쉽지만 나쁜 습관으로 간주됩니다. 내가 생각하는 다른 방법은, JPanel의 paintComponent를 오버라이드하는 대신, 추가하고있는 JLabel을 오버라이드 (override)하는 것이다. 코드는 정확히 같을 것입니다. 대신 JLabel에 코드를 적용하면됩니다.

+0

좋아, 일반적으로 감사합니다. 그래도 이미지 아래에 사각형이 인쇄됩니다. 나는 그것을 끝내고 싶다. 이유는 무엇일까요? 내가 rect를 추가하기 전에 이미지를 dispaly ... – Igr

+0

당신은 이미지가 rect에서 화면 위에 있다는 것을 의미합니까? "g.drawRect (...)"행을 "g.drawRect (rectPosition.x, rectPosition.y - rectSize.height, rectSize.width, rectSize.height)"로 변경하면 수정해야합니다. 또는 rect가 그려진 다음 이미지가 그려져 rect의 일부가 차단됩니까? – resueman

+0

두 번째 것. 사각형은 프레임에 그려 지지만 표시된 이미지 아래에 표시됩니다 (이미지 근처에 추가하면 rect의 일부가 아래에 표시됨). – Igr