2016-11-29 9 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-with-java-swing/ –

答えて

0

しかし、問題は、私がウィンドウのサイズを変更すると、私はたくさんの品質を失うことです。

画像のサイズを変更すると、画質が低下します。これはピクセル化と呼ばれます。品質を落としたくない場合は、イメージのサイズを大きくしないでください。

JPanelを拡張してpaint()メソッドをオーバーライドしたグラフを作成しました。

paint()をオーバーライドしないでください。カスタムペイントはpaintComponent(...)をオーバーライドして行い、メソッドの最初にsuper.paintComponent(...)を忘れないでください。

しかし、なぜあなたはカスタムパネルを作成していますか? BufferedImageを使用してImageIconを作成し、次にImageIconJLabelに追加してください。この方法では、イメージは常に実際のサイズで表示されるので、ウィンドウのサイズを変更しても品質には影響しません。

+0

これは私が最初にやったことです。しかし、スナップショットを拡大する方法があるかどうかは、品質を損なうことなく、ユーザーにとって非常に役立つだろうと思っていました。私はこれがイメージ( 'Image'、' ImageIcon'など)によってはおそらく不可能であることを知っています。私の目標は、私の目標を達成するための他の方法があるかどうかです。 – Roberto

+0

これはJavaとは関係ありません。品質を損なうことなくイメージを大きくすることはできません。カメラで撮った写真をズームしてみたことがありますか? – camickr

関連する問題