如何通过Java动态调整绘图区域的大小?

如何通过Java动态调整绘图区域的大小?,java,graphics,bufferedimage,Java,Graphics,Bufferedimage,我试图在不丢失图像上绘制的图形的情况下调整我的BuffereImage(我的绘图区域)的大小,并在调整大小后继续绘制。(如在Paint.NET)我使用JSplitPane从边缘执行此操作,但当我想继续绘制时,光标(笔)距离绘制的图形约3厘米(形状)因为图形随着图像的增长而增长。当我删除整个图片时,效果会更好。和 我在Google和StackoverFlow中查看了答案,但我觉得这不管用。我怎样才能解决这个问题 到目前为止,我是这样尝试的: 类用户界面 jSplitPane.addProperty

我试图在不丢失图像上绘制的图形的情况下调整我的BuffereImage(我的绘图区域)的大小,并在调整大小后继续绘制。(如在Paint.NET)我使用JSplitPane从边缘执行此操作,但当我想继续绘制时,光标(笔)距离绘制的图形约3厘米(形状)因为图形随着图像的增长而增长。当我删除整个图片时,效果会更好。

我在Google和StackoverFlow中查看了答案,但我觉得这不管用。我怎样才能解决这个问题

到目前为止,我是这样尝试的:

类用户界面

jSplitPane.addPropertyChangeListener(jSplitPane.DIVIDER\u LOCATION\u属性,(PropertyChangeEvent evt)->{
double-imageHeight=jSplitPane.getDividerLocation();
双图像宽度=图像高度*1.6;
top.setDividerLocation((int)图像宽度);
drawGround.changeImageSizeDynmcally((int)imageWidth,(int)imageHeight);
重新粉刷();
});

班级休息室

     BufferedImage masterImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
    //image is master image drawing at first time.

    public void changeImageSizeDynmcally(int w, int h) {
      AREA_WIDTH = w;
      AREA_HEIGHT = h;
      repaint();

      BufferedImage scaledImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
      Graphics2D g2D = scaledImage.createGraphics();
      g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
      g2D.drawImage(masterImage, 0, 0, null);
      g2D.dispose();
}
用这种方法之后,我有

     `@Override
 protected void paintComponent(Graphics g) {
     super.paintComponent(g);
        if (masterImage != null) {
            g2D = (Graphics2D) masterImage.getGraphics();
            g2D.setComposite(AlphaComposite.Src); 
            bla,bla,bla`

我通过创建新的图像设置方法解决了这个问题:

public void changeImageSizeDynmcally(int x, int y) {

    AREA_WIDTH = x;
    AREA_HEIGHT = y;
    repaint();

    scaledImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2D = scaledImage.createGraphics();
    g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2D.drawImage(image,0,0, null);

    g2D.dispose();
    setImage(scaledImage); //this is a new method!
}`
新方法是:

public void setImage(BufferedImage img){
如果(img!=null){
g2D=(Graphics2D)img.getGraphics();
g2D.setComposite(AlphaComposite.Src);
g2D.setRenderingHint(RenderingHints.KEY\u COLOR\u RENDERING,RenderingHints.VALUE\u COLOR\u RENDER\u QUALITY);
g2D.setRenderingHint(renderingHits.KEY_RENDERING,renderingHits.VALUE_RENDER_QUALITY);
g2D.setRenderingHint(renderingHits.KEY\u STROKE\u控件,renderingHits.VALUE\u STROKE\u PURE);
g2D.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
g2D.setRenderingHint(renderingHits.KEY\u TEXT\u ANTIALIAS,renderingHits.VALUE\u TEXT\u ANTIALIAS\u LCD\u HRGB);
masterImage=img;
重新油漆();
}
}

它的工作原理类似于将新图像分配给旧图像。

制作一个新的
缓冲图像
,按照您想要的大小绘制原始
缓冲图像
(即
图形#绘图图像
),将新的
buffereImage
指定给旧的图像…您从未将
scaleImage
指定给任何对象,因此
masterImage
(现在是旧图像)仍然是used@MadProgrammer感谢您的回答,您是对的,现在我将尝试通知u.@MadProgrammer使用新的缩放图像更改主图像,我需要创建返回BuffereImage的新方法。因为在我的方法中它是直接绘制的。为什么不将
scaleImage
分配给
masterImage
(并触发重新绘制).
masterImage=scaledImage;