JScrollPanel для масштабирования изображения - Java

Узнай цену своей работы

Формулировка задачи:

Необходимо сделать масштабирование изображения. проблема в том, что когда изображение увеличивается, оно прорисовывается не полностью, а только та часть, которая влезает в экран. А нужно, что бы , если изображение не влезает-образовывались скроллы по бокам фрейма и при прокрутке их можно было бы увидеть то, что не вместилось. Скроллы появляются, а изображение не прорисовывается(( Методы, отвечающие за растяжение/сжатие изображения
private void Unzooming(){
        main=new Main();
        setImg(main.getGPanel().getBufferImg());
        actions=new RActions();
        System.out.println(startX+" "+startY);
        gr=getImg().createGraphics();
        double multiple = 0.5;
        int height = (int) (img.getHeight() * multiple);
        int width = (int) (img.getWidth() * multiple);
 
        Image im = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
 
        //Желательно бы заменить более функциональным, но на первое время сойдет
        gr.setColor(Color.WHITE);
        gr.fillRect(im.getWidth(main.getGPanel()),0,1200,720);
        gr.fillRect(0,im.getHeight(main.getGPanel()),1200,720);
 
        gr.drawImage(im, 0, 0, main.getGPanel());
        main.getGPanel().repaint();
        //graphPanel.setBufferSize(new Dimension(im.getWidth(main.getGPanel()), im.getHeight(main.getGPanel())));
       // graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()), im.getHeight(main.getGPanel())));
 
       // main.getGPanel().repaint();
        System.out.println("----");
    }
    private void Zooming(){
        main=new Main();
        actions=new RActions();
        System.out.println(startX+" "+startY);
        gr=getImg().createGraphics();
        double multiple = 2.0;
        int height = (int) (img.getHeight() * multiple);
        int width = (int) (img.getWidth() * multiple);
        graphPanel=main.getGPanel();
 
        Image im = img.getScaledInstance(width,height,Image.SCALE_SMOOTH);
 
        if(im.getHeight(main.getGPanel())>img.getHeight(main.getGPanel())){
 
            graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()),im.getHeight(main.getGPanel())));
 
            gr.drawImage(im,0,0,main.getGPanel());
            System.out.println("размер больше по вертикали");
         }
        if (im.getWidth(main.getGPanel())>img.getWidth(main.getGPanel())){
 
            System.out.println("размер больше по горизонтали");
            graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()),im.getHeight(main.getGPanel())));
            gr.drawImage(im,0,0,main.getGPanel());
 
         }
        main.getGPanel().repaint();
        gr.drawImage(im, 0, 0, main.getGPanel());
        System.out.println("++++");
    }
Класс, отвечающий за прорисовку изображения на буффере, а затем буффера на панели
package TestImportGraph;
 
/**
 * Создано 25.11.14
 */
 
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class GraphPanel extends JPanel {
       private Dimension size;
       private RActions actions;
       private static BufferedImage bufferImg;
       private GraphMetods graphMetods=new GraphMetods();
       private FigureFrame figureFrame=new FigureFrame();
       private static Graphics gr1;
       private ColorFrame colorFrame=new ColorFrame();

    int oldGraficMode;
    int oldDepth;
    boolean FillOn;
    Color oldColor;
        public void Init(){
          actions=new RActions();
          size = new Dimension(actions.getWidthComponent(), actions.getHeightComponent());
          bufferImg = doBufferImg(actions.getWidthComponent(),actions.getHeightComponent());
            // Это что бы система стирала фон.(При отсутсвии этой записи будут проблемы с краями изображения при изменении размеров окна
            this.setOpaque(false);
        }
        final BufferedImage doBufferImg(int canvasWidth, int canvasHeight) {
            BufferedImage img;
            Graphics gr;
 
            img = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
 
            //Прорисовка белого фона на координатах от (0,0) до (1200,800)(задано в полях)
            gr=img.createGraphics();
            gr.setColor(Color.WHITE);
            gr.fillRect(0,0,getWidth(),getHeight());
            //
                if (bufferImg!= null) {
              // Получение наименьшей ширины и высоты.
                int minWidth = bufferImg.getWidth();
                minWidth = minWidth < canvasWidth ? minWidth : canvasWidth;//Если minWidth < canvasWidth, то minWidth=minWidth, иначе minWidth=canvasWidth
                int minHeight = bufferImg.getHeight();
                minHeight = minHeight < canvasHeight ? minHeight : canvasHeight;//Если minHeight < canvasHeight, то minHeight=minHeight, иначе minHeight=canvasHeight
               // Копирование изображения.
                img.setData(bufferImg.getData(new Rectangle(minWidth, minHeight)));
            }
            return img;
        }
        public BufferedImage getBufferImg() {
            return bufferImg;
        }
        public Dimension getBufferSize() {
            return size;
        }
        public int getBufferedWidth(){
            return bufferImg.getWidth();
        }
        public int getBufferedHeight(){
            return bufferImg.getHeight();
        }
        public void setBufferImg(BufferedImage bufImage){
            bufferImg=bufImage;
        }
        public Graphics getGraphicsPanel(){
            return gr1;
        }
        public void setBufferSize(Dimension canvasSize) {
            bufferImg=doBufferImg(canvasSize.width, canvasSize.height);
            size=canvasSize;
            revalidate();
            repaint();
        }
        @Override
            public Dimension getPreferredSize() {
                if (this.isPreferredSizeSet()) {
                    return super.getPreferredSize();
                }
            return size;
        }
        @Override
        public void paintComponent(Graphics gr) {
            if (bufferImg!=null) {
                gr.drawImage(bufferImg, 0, 0, this);
                gr1=gr;
 
            }
            try {
                if(oldGraficMode==graphMetods.getMode()&&FillOn==figureFrame.getFillOn()&&oldColor==colorFrame.getCustomColor()&&oldDepth==figureFrame.getDepth())
                graphMetods.ChoiceMode(colorFrame.getCustomColor(),(byte)2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            oldGraficMode=graphMetods.getMode();
            FillOn=figureFrame.getFillOn();
            oldColor=colorFrame.getCustomColor();
            oldDepth=figureFrame.getDepth();
        }
}
Основной класс
public class Main{
    private GraphMetods graphMetods;
    private RecordToFile record;
    static JFrame frame;
    private RActions actions;
    private static GraphPanel graphPanel;
    private NorthPanel northPanel;
    private WestPanel westPanel;
    private static SouthPanel southPanel;
    //private JPanel SouthPanel_1;
    private JPanel EastPanel_1;
 
    public void InitPanel(){
        actions=new RActions();
        record=new RecordToFile();
        frame = new JFrame("testGraphRed");
        graphPanel = new GraphPanel();
        graphPanel.Init();
        EastPanel_1=new JPanel();
 
        northPanel=new NorthPanel();
        westPanel=new WestPanel();
        southPanel=new SouthPanel();
    }
     void doFrame() {
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(1200, 740);
    }
    public void GraphStructure(){
        graphMetods=new GraphMetods();
        this.strEastPanel();
       // this.strSouthPanel();
        this.strGraphPanel();
        graphMetods.WhitePanel();
        record.createPackage();
        northPanel.strNorthPanel();
        westPanel.strWestPanel();
        southPanel.strSouthPanel();
        frame.add(BorderLayout.NORTH, northPanel.getNorthPanel_1());
        frame.add(BorderLayout.WEST,westPanel.getWestPanel_1());
        frame.add(BorderLayout.SOUTH, southPanel.getSouthPanel_1());
        frame.add(BorderLayout.EAST,EastPanel_1);
        frame.add(BorderLayout.CENTER,new JScrollPane(graphPanel));
        frame.pack();
        frame.setVisible(true);
        System.out.println(graphMetods.getImg().getColorModel());
    }
   // public void strSouthPanel(){
   //     southPanel.getSouthPanel_1().setBackground(new Color(80, 100, 100));
    //}
    public void strEastPanel(){
        EastPanel_1.setBackground(new Color(70, 40, 29));
    }
    public void strGraphPanel(){
         graphPanel.addMouseMotionListener(actions.getMouseMotionEv_1());
         graphPanel.addComponentListener(actions.getComponentEv_1());
         graphPanel.addMouseListener(actions.getMouseEv_1());
    }
    public GraphPanel getGPanel(){
        return graphPanel;
    }
    public SouthPanel getSPanel(){return southPanel;}
 
}
Если необходимо-скину полный проект

Решение задачи: «JScrollPanel для масштабирования изображения»

textual
Листинг программы
public Dimension getPreferredSize() {
        return new Dimension(1300, 1000);
    } надо еще вот этот метод до определить

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5