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);
} надо еще вот этот метод до определить