2016-11-29 4 views
0

JPanel을 확장하고 paint() 메서드를 재정의하는 차트를 만들었습니다. 이 패널을 클릭하면 차트의 "스냅 샷"을 만들고 새로운 JFrame에서 열어보고 싶습니다.JPanel의 스냅 샷을 찍은 다음 새 창에 표시하십시오.

아래와 같이 버퍼링 된 이미지를 만들려고했으나 문제는 크기를 조정할 때 품질이 느슨합니다.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.BufferedImage; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class SnapshotDemo extends JPanel{ 

    private JComponent src; 
    private BufferedImage img; 
    private final JFrame f = new JFrame(); 

    public SnapshotDemo(JComponent src) { 
     super(new BorderLayout()); 
     this.src = src; 
     this.img = takeSnapshot(src); 
    } 


    @Override 
    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.drawImage(img, 0, 0, getWidth(), getHeight(), null); 
    } 

    public void display(){ 
     f.setContentPane(this); 
     f.setSize(1000,600); 
     f.setVisible(true); 
    } 

    public static BufferedImage takeSnapshot(JComponent src){ 
     BufferedImage i = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = i.createGraphics(); 
     src.printAll(g2); 
     return i; 
    } 

    public static void main(String[] args) { 
     JPanel p = new JPanel(){ 
      @Override 
      public void paint(Graphics g) { 
       super.paint(g); 
       Graphics2D g2 = (Graphics2D)g.create(); 
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
       int x = 0; 
       int y = 0; 
       int stepx = getWidth()/5; 
       int stepy = getHeight()/5; 
       for(int i=0; i<10; i++){ 
        g2.drawLine(x, y, x+stepx, y+stepy); 
        x+=stepx; 
        y+=stepy; 
       } 
       g2.setPaint(Color.red); 
       g2.drawOval(getWidth()/2-30, getHeight()/2-30, 60, 60); 
      } 
     }; 
     p.addMouseListener(new MouseListener() { 
      @Override 
      public void mouseReleased(MouseEvent e) {} 
      @Override 
      public void mousePressed(MouseEvent e) {} 
      @Override 
      public void mouseExited(MouseEvent e) {} 
      @Override 
      public void mouseEntered(MouseEvent e) {} 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       SnapshotDemo d = new SnapshotDemo(p); 
       d.display(); 
      } 
     }); 
     JFrame f = new JFrame(); 
     f.setContentPane(p); 
     f.setSize(1000, 600); 
     f.setVisible(true); 
    } 
} 

이 문제를 더 잘 처리하는 방법에 대한 아이디어가 있으십니까? 이미지 (BufferedImage 등 ...)의 사용을 피할 수있는 방법이 있습니까? 미리 감사드립니다.

+0

차트 모델의 스냅 샷을 만들고이 프레임을 새 프레임에 사용하십시오. –

+0

무슨 뜻인지 좀 더 설명해 주시겠습니까? 미안하지만 나는 프로그래머가 아니며 "인형을위한"설명이 필요합니다. D – Roberto

+1

스윙은 모델 뷰 컨트롤러 아키텍처를 기반으로하므로 뷰는 모델 상태 만 표시합니다. 따라서 모델의 스냅 샷을 찍어 다른 뷰 인스턴스와 함께 사용하면 크기를 조정할 수 있습니다. mvc에 대한 자세한 내용은 http://www.oracle.com/technetwork/articles/javase/index-142890.html 및 https://www.link-intersystems.com/blog/2013/07/20을 참조하십시오./the-mvc-pattern-implemented-java-swing/ –

답변

0

하지만 문제는 크기를 조정할 때 품질이 느슨합니다.

이미지의 크기를 조정하면 품질이 떨어집니다. 이것은 pixilation이라고합니다. 품질을 떨어 뜨리고 싶지 않으면 이미지의 크기를 더 크게 조정하지 마십시오.

JPanel을 확장하고 paint() 메소드를 재정의하는 차트를 만들었습니다.

paint()를 재정의하지 마십시오. 사용자 정의 페인팅은 paintComponent(...)을 무시하고 메소드 처음에 super.paintComponent(...)을 잊지 마세요.

하지만 맞춤 패널을 만드는 이유는 무엇입니까? BufferedImage을 사용하여 ImageIcon을 만든 다음 ImageIconJLabel에 추가하기 만하면됩니다. 이렇게하면 이미지가 실제 크기로 항상 표시되므로 창 크기를 조정해도 품질에는 영향을 미치지 않습니다.

+0

이것은 처음에 내가 한 일입니다. 그러나 스냅 샷을 품질을 잃지 않고 확대하는 방법이 있다면 사용자에게 매우 유용 할 것이므로 궁금합니다. 나는 이것이 이미지 ('Image','ImageIcon' 또는 무엇이든)를 통해 가능하지 않음을 알고 있습니다. 그래서 제 목표를 달성하는 다른 방법이 있다면 제 질문이 그 것입니다. – Roberto

+0

이것은 Java와는 아무런 관련이 없습니다. 품질을 잃지 않고 이미지를 크게 만들 수는 없습니다. 카메라로 찍은 사진을 확대/축소 해 본 적이 있습니까? – camickr