亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我在 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)??赡苡袔椭?/p>

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 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號