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

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

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

Необходимо сделать масштабирование изображения. проблема в том, что когда изображение увеличивается, оно прорисовывается не полностью, а только та часть, которая влезает в экран. А нужно, что бы , если изображение не влезает-образовывались скроллы по бокам фрейма и при прокрутке их можно было бы увидеть то, что не вместилось. Скроллы появляются, а изображение не прорисовывается(( Методы, отвечающие за растяжение/сжатие изображения
Листинг программы
  1. private void Unzooming(){
  2. main=new Main();
  3. setImg(main.getGPanel().getBufferImg());
  4. actions=new RActions();
  5. System.out.println(startX+" "+startY);
  6. gr=getImg().createGraphics();
  7. double multiple = 0.5;
  8. int height = (int) (img.getHeight() * multiple);
  9. int width = (int) (img.getWidth() * multiple);
  10. Image im = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
  11. //Желательно бы заменить более функциональным, но на первое время сойдет
  12. gr.setColor(Color.WHITE);
  13. gr.fillRect(im.getWidth(main.getGPanel()),0,1200,720);
  14. gr.fillRect(0,im.getHeight(main.getGPanel()),1200,720);
  15. gr.drawImage(im, 0, 0, main.getGPanel());
  16. main.getGPanel().repaint();
  17. //graphPanel.setBufferSize(new Dimension(im.getWidth(main.getGPanel()), im.getHeight(main.getGPanel())));
  18. // graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()), im.getHeight(main.getGPanel())));
  19. // main.getGPanel().repaint();
  20. System.out.println("----");
  21. }
  22. private void Zooming(){
  23. main=new Main();
  24. actions=new RActions();
  25. System.out.println(startX+" "+startY);
  26. gr=getImg().createGraphics();
  27. double multiple = 2.0;
  28. int height = (int) (img.getHeight() * multiple);
  29. int width = (int) (img.getWidth() * multiple);
  30. graphPanel=main.getGPanel();
  31. Image im = img.getScaledInstance(width,height,Image.SCALE_SMOOTH);
  32. if(im.getHeight(main.getGPanel())>img.getHeight(main.getGPanel())){
  33. graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()),im.getHeight(main.getGPanel())));
  34. gr.drawImage(im,0,0,main.getGPanel());
  35. System.out.println("размер больше по вертикали");
  36. }
  37. if (im.getWidth(main.getGPanel())>img.getWidth(main.getGPanel())){
  38. System.out.println("размер больше по горизонтали");
  39. graphPanel.setSize(new Dimension(im.getWidth(main.getGPanel()),im.getHeight(main.getGPanel())));
  40. gr.drawImage(im,0,0,main.getGPanel());
  41. }
  42. main.getGPanel().repaint();
  43. gr.drawImage(im, 0, 0, main.getGPanel());
  44. System.out.println("++++");
  45. }
Класс, отвечающий за прорисовку изображения на буффере, а затем буффера на панели
Листинг программы
  1. package TestImportGraph;
  2. /**
  3. * Создано 25.11.14
  4. */
  5. import javax.swing.*;
  6. import java.awt.*;
  7. import java.awt.image.BufferedImage;
  8.  
  9. public class GraphPanel extends JPanel {
  10. private Dimension size;
  11. private RActions actions;
  12. private static BufferedImage bufferImg;
  13. private GraphMetods graphMetods=new GraphMetods();
  14. private FigureFrame figureFrame=new FigureFrame();
  15. private static Graphics gr1;
  16. private ColorFrame colorFrame=new ColorFrame();
  17.  
  18. int oldGraficMode;
  19. int oldDepth;
  20. boolean FillOn;
  21. Color oldColor;
  22. public void Init(){
  23. actions=new RActions();
  24. size = new Dimension(actions.getWidthComponent(), actions.getHeightComponent());
  25. bufferImg = doBufferImg(actions.getWidthComponent(),actions.getHeightComponent());
  26. // Это что бы система стирала фон.(При отсутсвии этой записи будут проблемы с краями изображения при изменении размеров окна
  27. this.setOpaque(false);
  28. }
  29. final BufferedImage doBufferImg(int canvasWidth, int canvasHeight) {
  30. BufferedImage img;
  31. Graphics gr;
  32. img = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
  33. //Прорисовка белого фона на координатах от (0,0) до (1200,800)(задано в полях)
  34. gr=img.createGraphics();
  35. gr.setColor(Color.WHITE);
  36. gr.fillRect(0,0,getWidth(),getHeight());
  37. //
  38. if (bufferImg!= null) {
  39. // Получение наименьшей ширины и высоты.
  40. int minWidth = bufferImg.getWidth();
  41. minWidth = minWidth < canvasWidth ? minWidth : canvasWidth;//Если minWidth < canvasWidth, то minWidth=minWidth, иначе minWidth=canvasWidth
  42. int minHeight = bufferImg.getHeight();
  43. minHeight = minHeight < canvasHeight ? minHeight : canvasHeight;//Если minHeight < canvasHeight, то minHeight=minHeight, иначе minHeight=canvasHeight
  44. // Копирование изображения.
  45. img.setData(bufferImg.getData(new Rectangle(minWidth, minHeight)));
  46. }
  47. return img;
  48. }
  49. public BufferedImage getBufferImg() {
  50. return bufferImg;
  51. }
  52. public Dimension getBufferSize() {
  53. return size;
  54. }
  55. public int getBufferedWidth(){
  56. return bufferImg.getWidth();
  57. }
  58. public int getBufferedHeight(){
  59. return bufferImg.getHeight();
  60. }
  61. public void setBufferImg(BufferedImage bufImage){
  62. bufferImg=bufImage;
  63. }
  64. public Graphics getGraphicsPanel(){
  65. return gr1;
  66. }
  67. public void setBufferSize(Dimension canvasSize) {
  68. bufferImg=doBufferImg(canvasSize.width, canvasSize.height);
  69. size=canvasSize;
  70. revalidate();
  71. repaint();
  72. }
  73. @Override
  74. public Dimension getPreferredSize() {
  75. if (this.isPreferredSizeSet()) {
  76. return super.getPreferredSize();
  77. }
  78. return size;
  79. }
  80. @Override
  81. public void paintComponent(Graphics gr) {
  82. if (bufferImg!=null) {
  83. gr.drawImage(bufferImg, 0, 0, this);
  84. gr1=gr;
  85. }
  86. try {
  87. if(oldGraficMode==graphMetods.getMode()&&FillOn==figureFrame.getFillOn()&&oldColor==colorFrame.getCustomColor()&&oldDepth==figureFrame.getDepth())
  88. graphMetods.ChoiceMode(colorFrame.getCustomColor(),(byte)2);
  89. } catch (InterruptedException e) {
  90. e.printStackTrace();
  91. }
  92. oldGraficMode=graphMetods.getMode();
  93. FillOn=figureFrame.getFillOn();
  94. oldColor=colorFrame.getCustomColor();
  95. oldDepth=figureFrame.getDepth();
  96. }
  97. }
Основной класс
Листинг программы
  1. public class Main{
  2. private GraphMetods graphMetods;
  3. private RecordToFile record;
  4. static JFrame frame;
  5. private RActions actions;
  6. private static GraphPanel graphPanel;
  7. private NorthPanel northPanel;
  8. private WestPanel westPanel;
  9. private static SouthPanel southPanel;
  10. //private JPanel SouthPanel_1;
  11. private JPanel EastPanel_1;
  12. public void InitPanel(){
  13. actions=new RActions();
  14. record=new RecordToFile();
  15. frame = new JFrame("testGraphRed");
  16. graphPanel = new GraphPanel();
  17. graphPanel.Init();
  18. EastPanel_1=new JPanel();
  19. northPanel=new NorthPanel();
  20. westPanel=new WestPanel();
  21. southPanel=new SouthPanel();
  22. }
  23. void doFrame() {
  24. frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  25. frame.setSize(1200, 740);
  26. }
  27. public void GraphStructure(){
  28. graphMetods=new GraphMetods();
  29. this.strEastPanel();
  30. // this.strSouthPanel();
  31. this.strGraphPanel();
  32. graphMetods.WhitePanel();
  33. record.createPackage();
  34. northPanel.strNorthPanel();
  35. westPanel.strWestPanel();
  36. southPanel.strSouthPanel();
  37. frame.add(BorderLayout.NORTH, northPanel.getNorthPanel_1());
  38. frame.add(BorderLayout.WEST,westPanel.getWestPanel_1());
  39. frame.add(BorderLayout.SOUTH, southPanel.getSouthPanel_1());
  40. frame.add(BorderLayout.EAST,EastPanel_1);
  41. frame.add(BorderLayout.CENTER,new JScrollPane(graphPanel));
  42. frame.pack();
  43. frame.setVisible(true);
  44. System.out.println(graphMetods.getImg().getColorModel());
  45. }
  46. // public void strSouthPanel(){
  47. // southPanel.getSouthPanel_1().setBackground(new Color(80, 100, 100));
  48. //}
  49. public void strEastPanel(){
  50. EastPanel_1.setBackground(new Color(70, 40, 29));
  51. }
  52. public void strGraphPanel(){
  53. graphPanel.addMouseMotionListener(actions.getMouseMotionEv_1());
  54. graphPanel.addComponentListener(actions.getComponentEv_1());
  55. graphPanel.addMouseListener(actions.getMouseEv_1());
  56. }
  57. public GraphPanel getGPanel(){
  58. return graphPanel;
  59. }
  60. public SouthPanel getSPanel(){return southPanel;}
  61. }
Если необходимо-скину полный проект

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

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут