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