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);
- } надо еще вот этот метод до определить
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д