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

How to resize drawing area dynamically via Java?

我正在尝试调整 BufferedImage(我的绘图区域)的大小而不丢失图像上绘制的图形,并在调整大小后继续绘制.(就像在 Paint.NET 中一样)我正在从边缘使用 JSplitPane 执行此操作并且它正在发生但是当我想继续绘制时,光标(笔)一直在距离绘制的图形(形状)3 厘米,因为图形随图像增长。当我删除整个图片时,它会变得更好。 and

我查看了 Google 和 Whosebug 中的答案,但它不适用于 me.How 我可以解决这个问题吗?

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

Class UI

jSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, (PropertyChangeEvent evt) -> { double imageHeight = jSplitPane.getDividerLocation(); double imageWidth = imageHeight * 1.6; top.setDividerLocation((int) imageWidth); drawGround.changeImageSizeDynmcally((int) imageWidth, (int) imageHeight); drawGround.repaint(); });

Class DrawGround

     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) { if (img != null) { g2D = (Graphics2D) img.getGraphics(); g2D.setComposite(AlphaComposite.Src); g2D.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); masterImage = img; repaint(); } } 就像将新图像分配给旧图像一样工作。