为了账号安全,请及时绑定邮箱和手机立即绑定

当我在 jscrollpane 上上下滚动时,图像的某些部分消失了

当我在 jscrollpane 上上下滚动时,图像的某些部分消失了

至尊宝的传说 2023-05-10 13:46:52
大家好,我对在 a 中绘制的图像有疑问JPanel。将图像绘制到面板时没有问题。当我向上或向下滚动图像时出现问题。当再次返回该部分时,在视口中未看到的图像部分会被涂成白色。我 BufferedImage 在JPanel. 我还可以使用调整图像大小AffineTransform。问题是当我JScollPane在图像中添加 a 时,每当我向上或向下滚动时,scrollpane图像的某些部分就会消失..我也尝试过使用drawRenderedImage它确实解决了滚动的问题,但它搞砸了其他功能。这是我能做的最简洁的代码;package convert;import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.awt.image.BufferedImage;import java.io.*;import java.net.*;import java.util.ArrayList;import javax.imageio.ImageIO;import javax.swing.*;import javax.swing.event.*;public class ZoomTest {    public static void main(String[] args) {        ImagePanel panel = new ImagePanel();        JFrame f = new JFrame();        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        f.getContentPane().add(new JScrollPane(panel));        f.setSize(1200, 1200);        f.setLocationRelativeTo(null);        f.setVisible(true);    }}class ImagePanel extends JPanel {    BufferedImage image;    double scale;    public ImagePanel() {        loadImage();        scale = .38;        addMouseWheelListener(new MouseWheelListener() {            @Override            public void mouseWheelMoved(MouseWheelEvent e) {                int rotation = e.getWheelRotation();                if (rotation < 0) {                    scale -= .05;                } else {                    scale += .05;                }                if (scale < 0) {                    scale = 0;                }                revalidate();                repaint();            }        });    }    @Override    protected void paintComponent(Graphics g) {        super.paintComponent(g);        Graphics2D g2 = (Graphics2D) g;        double x = (getWidth() - scale * image.getWidth()) / 2;        double y = (getHeight() - scale * image.getHeight()) / 2;        AffineTransform at = new AffineTransform();        at.translate(x, y);        at.scale(scale, scale);        g2.setTransform(at);        g2.drawImage(image, 0, 0, null);    }
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

看看Graphics2D#drawImage(Image, AffineTransform, ImageObserver)。可能有帮助。

package convert;


import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.awt.image.BufferedImage;

import java.io.*;

import java.net.*;

import java.util.ArrayList;

import javax.imageio.ImageIO;

import javax.swing.*;

import javax.swing.event.*;


public class ZoomTest2 {

  public static void main(String[] args) {

    ImagePanel panel = new ImagePanel();

    JFrame f = new JFrame();

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    f.getContentPane().add(new JScrollPane(panel));

    f.setSize(1200, 1200);

    f.setLocationRelativeTo(null);

    f.setVisible(true);

  }

}


class ImagePanel extends JPanel {

  BufferedImage image;

  double scale;


  public ImagePanel() {

    loadImage();

    scale = .38;

    addMouseWheelListener(new MouseWheelListener() {

      @Override

      public void mouseWheelMoved(MouseWheelEvent e) {

        int rotation = e.getWheelRotation();

        if (rotation < 0) {

          scale -= .05;

        } else {

          scale += .05;

        }

        if (scale < 0) {

          scale = 0;

        }

        revalidate();

        repaint();

      }

    });

  }


  @Override

  protected void paintComponent(Graphics g) {

    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g.create();


    double x = (getWidth() - scale * image.getWidth()) / 2;

    double y = (getHeight() - scale * image.getHeight()) / 2;

    AffineTransform at = new AffineTransform();

    at.translate(x, y);

    at.scale(scale, scale);


    // g2.setTransform(at);

    // g2.drawImage(image, 0, 0, this);

    g2.drawImage(image, at, this);


    // or:

    // AffineTransform atf = g2.getTransform();

    // atf.concatenate(at);

    // g2.setTransform(atf);

    // g2.drawImage(image, 0, 0, this);


    g2.dispose();

  }


  public Dimension getPreferredSize() {

    int w = (int)(scale * image.getWidth());

    int h = (int)(scale * image.getHeight());

    return new Dimension(w, h);

  }


  private void loadImage() {

    String fileName = "aaa.png";

    try {

      image = ImageIO.read(new File(fileName));

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}


查看完整回答
反对 回复 2023-05-10
?
MMTTMM

TA贡献1869条经验 获得超4个赞

这是您的问题的解决方案。我在自定义绘画方面也很不走运,所以我的解决方案是直接更新鼠标滚轮上的图像并将其设置为标签。


import java.awt.Image;

import java.awt.event.MouseWheelEvent;

import java.awt.event.MouseWheelListener;

import java.awt.image.BufferedImage;

import java.io.File;


import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JScrollPane;

import javax.swing.SwingConstants;


public class ZoomTest {


    public static void main(String[] args) {

        ImagePanel panel = new ImagePanel();


        JFrame f = new JFrame();

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        f.getContentPane().add(new JScrollPane(panel));

        f.setSize(1000, 1000);

        f.setLocationRelativeTo(null);

        f.setVisible(true);

    }

}


class ImagePanel extends JLabel {


    BufferedImage image;


    double scale;


    public ImagePanel() {

        setHorizontalAlignment(SwingConstants.CENTER);

        loadImage();

        scale = .38;

        updateImage();

        addMouseWheelListener(new MouseWheelListener() {


            @Override

            public void mouseWheelMoved(MouseWheelEvent e) {

                int rotation = e.getWheelRotation();

                if (rotation < 0) {

                    scale -= .05;

                } else {

                    scale += .05;

                }

                if (scale < 0) {

                    scale = 0;

                }

                updateImage();

                revalidate();

                repaint();


            }

        });


    }


    private void updateImage() {

        int w = (int) (scale * image.getWidth());

        int h = (int) (scale * image.getHeight());

        setIcon(new ImageIcon(image.getScaledInstance(w, h, Image.SCALE_SMOOTH)));

    }


    private void loadImage() {

        String fileName = "c:\\users\\john ebarita\\downloads\\lorem-ipsum-1.jpg";

        try {

            image = ImageIO.read(new File(fileName));

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信