Java JScrollPane+;画布:渲染问题

Java JScrollPane+;画布:渲染问题,java,swing,awt,jscrollpane,repaint,Java,Swing,Awt,Jscrollpane,Repaint,我正在开发MS Paint的Java版本。到目前为止,你可以看到它是什么样子。(图片太高,太多,无法嵌入问题) 它使用JScrollPane移动Canvas的子类。如果不调整窗口的大小,它就可以正常工作。如果您创建了该窗口,乍一看,它的工作方式似乎完全相同 但是,如果您选择,则很明显应用程序正在渲染相同的“视口”,只是移动了。如果你这样做的话,它会变得更加明显,它与其他所有内容重叠 因此,基本上,它渲染了错误的视口。调整窗口大小将更新视口以使其正确。如果你试着画一个灰色区域,它画得很好,你就是看

我正在开发MS Paint的Java版本。到目前为止,你可以看到它是什么样子。(图片太高,太多,无法嵌入问题)

它使用
JScrollPane
移动
Canvas
的子类。如果不调整窗口的大小,它就可以正常工作。如果您创建了该窗口,乍一看,它的工作方式似乎完全相同

但是,如果您选择,则很明显应用程序正在渲染相同的“视口”,只是移动了。如果你这样做的话,它会变得更加明显,它与其他所有内容重叠

因此,基本上,它渲染了错误的视口。调整窗口大小将更新视口以使其正确。如果你试着画一个灰色区域,它画得很好,你就是看不见

每当滚动条移动时,我都尝试在画布上执行
repaint()
。这没有改变任何事情

我该怎么做才能解决这个问题

这是框架的代码:(参数
img
是它将在其上绘制的图像。您必须自己执行
setVisible(true)

没有正当理由,不要将Swing与AWT组件混用。改为扩展
JComponent


没有正当理由,不要将Swing与AWT组件混用。改为扩展
JComponent

用一个变量来构造你的。安德鲁,你能回答这个问题吗?我会检查的,因为它把一切都修好了。非常感谢:请输入D注释作为答案。很高兴你把它整理好了。:)用一个变量来构造你的。安德鲁,你能回答这个问题吗?我会检查的,因为它把一切都修好了。非常感谢:请输入D注释作为答案。很高兴你把它整理好了。:)
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;
    }
}
class JCanvas extends Canvas {