저는 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;
}
}
변형 된 ['FauxImage'] (http://stackoverflow.com/a/8090328/230513)를 사용하여 [sscce] (http://sscce.org/)를 구성하십시오. – trashgod
Andrew, 대답 해 주시겠습니까? 그것이 모든 것을 고쳤기 때문에 나는 그것을 검사 할 것이다. 고마워요. D –
답변이 답변으로 입력되었습니다. 다행 이군. :) –