2012-03-28 4 views
1

저는 Java Paint를 사용하고 있습니다. 지금까지 보이는 모습을 볼 수 있습니다 here. (이미지가 너무 크고 질문에 포함하기가 너무 많음)JScrollPane + Canvas : 렌더링 문제

JScrollPane을 사용하여 Canvas의 하위 클래스를 이동합니다. 창 크기를 조정하지 않으면 정상적으로 작동합니다. 창문을 smaller로 만들면 언뜻보기에는 똑같이 작동하는 것처럼 보입니다.

그러나 scroll around 인 경우 응용 프로그램이 방금 이동 한 것과 동일한 "뷰포트"를 렌더링하고 있음이 분명해집니다. keep scrolling 인 경우 다른 모든 항목과 겹치는 것이 더 분명합니다.

기본적으로 잘못된 뷰포트를 렌더링합니다. 창의 크기를 조정하면 뷰포트가 올바르게 업데이트됩니다. 회색 영역을 그릴 경우 그 영역을 잘 그립니다. 단지 볼 수 없습니다.

스크롤 막대를 움직일 때마다 캔버스에서 repaint()을 시도해 보았습니다. 아무것도 바뀌지 않았습니다.

이 문제를 해결하려면 어떻게해야합니까?

프레임에 대한 코드입니다. (인수 img 그것은 페인트 할 이미지 당신은뿐만 아니라 setVisible(true) 스스로해야 할)

import java.awt.*; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSlider; 


public class JPaint extends JFrame { 
    JPaintPanel panel; 
    public JPaint(BufferedImage img) { 
     super("Edit your image"); 
     panel = new JPaintPanel(img); 
     setContentPane(panel); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Trial and error got me these numbers. 
     //I have no idea how find the proper size... 
     setSize(img.getWidth()+20-1, img.getHeight()+50+50+2); 
    } 
    //go to the panel you hold, ask it to retrieve it from the canvas 
    public BufferedImage grabImage() { 
     return panel.grabImage(); 
    } 
} 


class JPaintPanel extends JPanel { 
    JTools toolbar; 
    JCanvas canvas; 
    JScrollPane scrollPane; 
    public JPaintPanel(BufferedImage img) { 
     super(new BorderLayout()); 
     toolbar = new JTools(); 
     canvas = new JCanvas(img); 
     JScrollPane scrollPane = new JScrollPane(canvas); 
     scrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       canvas.repaint(); 
      } 

     }); 
     scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       canvas.repaint(); 
      } 

     }); 
     setPreferredSize(new Dimension(img.getWidth(),img.getHeight()+50)); 
     add(toolbar, BorderLayout.PAGE_START); 
     add(scrollPane, BorderLayout.CENTER); 
    } 
    public BufferedImage grabImage() { 
     return canvas.getImage(); 
    } 
} 
class JTools extends JPanel { 
    JSlider scale; 

    public JTools() { 
     scale= new JSlider(JSlider.HORIZONTAL, 
            0, 400, 100); 
     scale.setMajorTickSpacing(100); 
     scale.setPaintTicks(true); 
     scale.setPaintLabels(true); 
     scale.setPreferredSize(new Dimension(300,50)); 
     add(scale); 
    } 

} 
class JCanvas extends Canvas { 

    BufferedImage im; 
    Graphics2D g2d; 
    Point old = new Point(); 
    Point now = new Point(); 

    public JCanvas(BufferedImage imIn) { 
     im = imIn; 
     g2d = im.createGraphics(); 


     setPreferredSize(new Dimension(im.getWidth(), im.getHeight())); 


     setColor(Color.WHITE); 
     setWidth(4); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     //g2d.drawRect(5, 5, 40, 20); 

     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       //System.out.println(e.getPoint()); 
       //g2d.fillRect(e.getX()-5, e.getY()-5, 10, 10); 
       old=e.getPoint(); 
       now=e.getPoint(); 
       g2d.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); 
       repaint(); 
      } 
     }); 
     addMouseListener(new MouseAdapter() { 
      public void mouseReleased(MouseEvent e) { 
       //System.out.println(e.getPoint()); 
       old=e.getPoint(); 
       now=e.getPoint(); 
       g2d.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); 
       repaint(); 
      } 
     }); 
     addMouseMotionListener(new MouseAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       //System.out.println(e.getPoint()); 
       //g2d.fillRect(e.getX()-5, e.getY()-5, 10, 10); 
       old=now; 
       now=e.getPoint(); 
       g2d.drawLine((int)old.getX(), (int)old.getY(), (int)now.getX(), (int)now.getY()); 
       repaint(); 
      } 
     }); 
    } 
    public void paint(Graphics g) { 
     //super.paint(g); 
     update(g); 
    } 
    public void update(Graphics g) { 
     //super.update(g); 
     g.drawImage(im, 0, 0, null); 
     getToolkit().sync(); 
    } 
    public void setWidth(float w) { 
     g2d.setStroke(new BasicStroke(w, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
    } 
    public void setColor(Color c) { 
     g2d.setColor(c); 
    } 
    public BufferedImage getImage() { 
     return im; 
    } 
} 
+2

변형 된 ['FauxImage'] (http://stackoverflow.com/a/8090328/230513)를 사용하여 [sscce] (http://sscce.org/)를 구성하십시오. – trashgod

+0

Andrew, 대답 해 주시겠습니까? 그것이 모든 것을 고쳤기 때문에 나는 그것을 검사 할 것이다. 고마워요. D –

+0

답변이 답변으로 입력되었습니다. 다행 이군. :) –

답변

1
class JCanvas extends Canvas { 

AWT 구성 요소와 스윙을 혼합하지 마십시오 정당한 이유없이. 대신 JComponent을 확장하십시오.