Img resizing with slider demo improvement

Could somebody take a look at this demo to see if it is posible to improve the quality of the image resizing?

(Remember it should work with transparents gifs as well)

thanks!

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GraphicsEnvironment;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.Transparency;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.io.File;

import java.text.NumberFormat;

import javax.imageio.ImageIO;

import javax.swing.AbstractAction;

import javax.swing.JFormattedTextField;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JSlider;

import javax.swing.KeyStroke;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.text.NumberFormatter;

publicclass ImgResizer{

publicstaticvoid main(String[] args){

javax.swing.SwingUtilities.invokeLater(new Runnable(){

publicvoid run(){

createAndShowGUI();

}

});

}

privatestaticvoid createAndShowGUI(){

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame jf =new JFrame("Resize Sample");

BufferedImage bi =null;

try{

bi = ImageIO.read(new File("C://DIBC//resources//images//pruebas//p1.gif"));

}catch (Exception e){

e.printStackTrace();

}

jf.add(new MyJPanel(bi));

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.pack();

jf.setVisible(true);

jf.setSize(500, 500);

jf.setLocation(300, 300);

}

}

class MyJPanelextends JPanelimplements PropertyChangeListener, ChangeListener{

privatestaticfinallong serialVersionUID = 7257285876983449683;

privatestaticfinalint MIN = 0;

privatestaticfinalint MAX = 50;

privatestaticfinalint INIT = 25;

privatestaticfinal String LBL ="Resize value";

private JFormattedTextField field;

private JSlider slider;

private JPicture picture;

privateint currentValue = INIT;

public MyJPanel(BufferedImage bi){

//Etiqueta

JLabel label =new JLabel(LBL);

//Campo de entrada num閞ico

NumberFormatter numberFormatter =new NumberFormatter(NumberFormat.getIntegerInstance());

numberFormatter.setMinimum(new Integer(MIN));

numberFormatter.setMaximum(new Integer(MAX));

field =new JFormattedTextField(numberFormatter);

field.setValue(new Integer(INIT));

field.setColumns(5);//ancho del campo

field.addPropertyChangeListener(this);

//Reacci髇 a la pulsaci髇 de 'Enter'

field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),"check");

field.getActionMap().put("check",new AbstractAction(){

privatestaticfinallong serialVersionUID = 4892779828503888164;

publicvoid actionPerformed(ActionEvent e){

if (!field.isEditValid()){//contenido invalido

Toolkit.getDefaultToolkit().beep();

field.selectAll();

}elsetry{//contenido v醠ido

field.commitEdit();//se usa

}catch (java.text.ParseException exc){}

}

});

//Barra desplazamiento

slider =new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);

slider.addChangeListener(this);

slider.setMajorTickSpacing(10);

slider.setMinorTickSpacing(1);

slider.setPaintTicks(true);

slider.setPaintLabels(true);

//Subpanel para la etiqueta y el campo

JPanel panelCampo =new JPanel();

panelCampo.add(label);

panelCampo.add(field);

//Subpanel para los iconos y la barra de desplazamiento

JPanel panelBarra =new JPanel();

panelBarra.add(new JLabel("min"));

panelBarra.add(slider);

panelBarra.add(new JLabel("max"));

picture =new JPicture(bi);

//Montamos los paneles

add(panelCampo);

add(panelBarra);

add(picture);

}

publicvoid stateChanged(ChangeEvent evt){

JSlider slider = (JSlider)evt.getSource();

int valor = (int)slider.getValue();

if (!slider.getValueIsAdjusting()){//done adjusting

field.setValue(new Integer(valor));//update ftf value

}else{//value is adjusting; just set the text

field.setText(String.valueOf(valor));

}

}

publicvoid propertyChange(PropertyChangeEvent evt){

if ("value".equals(evt.getPropertyName())){

Number valor = (Number)evt.getNewValue();

if (slider !=null && valor !=null){

int newValue = valor.intValue();

slider.setValue(newValue);

if (newValue > currentValue){

picture.increase(newValue);

}else{

picture.decrease(newValue);

}

currentValue = newValue;

}

}

}

}

class JPictureextends JLabel{

privatestaticfinallong serialVersionUID = 3365060732876948221;

BufferedImage bi;

public JPicture(BufferedImage bi){

setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));

this.bi = bi;

}

protectedvoid paintComponent(Graphics g){

Graphics2D g2 = (Graphics2D)g;

g2.drawImage(bi, 0, 0,null);

}

publicvoid increase(int percentage){

bi = ImgHandler.getBIaugmented(bi, percentage);

setBounds(getLocation().x, getLocation().y, bi.getWidth(), bi.getHeight());

}

publicvoid decrease(int percentage){

bi = ImgHandler.getBIreduced(bi, percentage);

setBounds(getLocation().x, getLocation().y, bi.getWidth(), bi.getHeight());

}

}

class ImgHandler{

publicstatic BufferedImage getBIaugmented(BufferedImage bi,int percentage){

int w = bi.getWidth();

int h = bi.getHeight();

double escalaW = (percentage * w) / 100;

double escalaH = (percentage * h) / 100;

int newW = (int)(w + escalaW);

int newH = (int)(h + escalaH);

return getBI(getImgRescaled(bi, newW, newH));

}

publicstatic BufferedImage getBIreduced(BufferedImage bi,int percentage){

int w = bi.getWidth();

int h = bi.getHeight();

double escalaW = (percentage * w) / 100;

double escalaH = (percentage * h) / 100;

int newW = (int)(w - escalaW);

int newH = (int)(h - escalaH);

return getBI(getImgRescaled(bi, newW, newH));

}

publicstatic Image getImgRescaled(BufferedImage bi,int w,int h){

return bi.getScaledInstance(w, h, Image.SCALE_SMOOTH);

}

publicstatic BufferedImage getBI(Image img){

int w = img.getWidth(null);

int h = img.getHeight(null);

BufferedImage bi = createBI(w, h);

Graphics2D g2 = bi.createGraphics();

g2.drawImage(img, 0, 0,null);

g2.dispose();

return bi;

}

publicstatic BufferedImage createBI(int w,int h){

return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(w, h, Transparency.BITMASK);

}

}

[15458 byte] By [JLuisa] at [2007-11-27 6:41:03]
# 1

hi,

hope this is better in sense that it does not loads the image again and again.

package com.ani;

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.io.File;

import java.text.NumberFormat;

import javax.imageio.ImageIO;

import javax.swing.AbstractAction;

import javax.swing.JFormattedTextField;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSlider;

import javax.swing.KeyStroke;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.text.NumberFormatter;

public class ImgResizer

{

public static void main(String[] args)

{

javax.swing.SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

createAndShowGUI();

}

});

}

private static void createAndShowGUI()

{

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame jf = new JFrame("Resize Sample");

BufferedImage bi = null;

try

{

bi = ImageIO.read(new File(

"C:/Documents and Settings/Administrator/My Documents/My Pictures/Bijoychowdhury06.jpg"));

}

catch (Exception e)

{

e.printStackTrace();

}

jf.add(new MyJPanel(bi));

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.pack();

jf.setVisible(true);

jf.setSize(500, 500);

jf.setLocation(300, 300);

}

}

class MyJPanel extends JPanel implements PropertyChangeListener, ChangeListener

{

private static final longserialVersionUID= 7257283;

private static final intMIN= 0;

private static final intMAX= 50;

private static final intINIT= 25;

private static final StringLBL= "Resize value";

private JFormattedTextFieldfield;

private JSliderslider;

private JPicturepicture;

private intcurrentValue= INIT;

public MyJPanel(BufferedImage bi)

{

//Etiqueta

JLabel label = new JLabel(LBL);

//Campo de entrada num閞ico

NumberFormatter numberFormatter = new NumberFormatter(NumberFormat

.getIntegerInstance());

numberFormatter.setMinimum(new Integer(MIN));

numberFormatter.setMaximum(new Integer(MAX));

field = new JFormattedTextField(numberFormatter);

field.setValue(new Integer(INIT));

field.setColumns(5); //ancho del campo

field.addPropertyChangeListener(this);

//Reacci髇 a la pulsaci髇 de 'Enter'

field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),

"check");

field.getActionMap().put("check", new AbstractAction()

{

private static final longserialVersionUID= 4892774;

public void actionPerformed(ActionEvent e)

{

if (!field.isEditValid())

{ //contenido invalido

Toolkit.getDefaultToolkit().beep();

field.selectAll();

}

else

try

{ //contenido v醠ido

field.commitEdit(); //se usa

}

catch (java.text.ParseException exc)

{

}

}

});

//Barra desplazamiento

slider = new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);

slider.addChangeListener(this);

slider.setMajorTickSpacing(10);

slider.setMinorTickSpacing(1);

slider.setPaintTicks(true);

slider.setPaintLabels(true);

//Subpanel para la etiqueta y el campo

JPanel panelCampo = new JPanel();

panelCampo.add(label);

panelCampo.add(field);

//Subpanel para los iconos y la barra de desplazamiento

JPanel panelBarra = new JPanel();

panelBarra.add(new JLabel("min"));

panelBarra.add(slider);

panelBarra.add(new JLabel("max"));

picture = new JPicture(bi);

setLayout(new BorderLayout());

//Montamos los paneles

JPanel l_pnlTop = new JPanel();

l_pnlTop.add(panelCampo);

l_pnlTop.add(panelBarra);

add(l_pnlTop, BorderLayout.NORTH);

add(new JScrollPane(picture), BorderLayout.CENTER);

}

public void stateChanged(ChangeEvent evt)

{

JSlider slider = (JSlider) evt.getSource();

int valor = (int) slider.getValue();

if (!slider.getValueIsAdjusting())

{ //done adjusting

field.setValue(new Integer(valor)); //update ftf value

}

else

{ //value is adjusting; just set the text

field.setText(String.valueOf(valor));

}

}

public void propertyChange(PropertyChangeEvent evt)

{

if ("value".equals(evt.getPropertyName()))

{

Number valor = (Number) evt.getNewValue();

if (slider != null && valor != null)

{

int newValue = valor.intValue();

slider.setValue(newValue);

if (newValue > currentValue)

{

picture.increase(newValue);

}

else

{

picture.decrease(newValue);

}

currentValue = newValue;

}

}

}

}

class JPicture extends JLabel

{

private static final longserialVersionUID= 3348221;

BufferedImagebi;

int percentage;

public JPicture(BufferedImage bi)

{

setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));

this.bi = bi;

}

protected void paintComponent(Graphics g)

{

Graphics2D g2 = (Graphics2D) g;

int w = bi.getWidth();

int h = bi.getHeight();

double escalaW = (percentage * w) / 100;

double escalaH = (percentage * h) / 100;

int newW = (int) (w + escalaW);

int newH = (int) (h + escalaH);

g2.drawImage(bi, 0, 0, newW, newH, this);

}

public void increase(int percentage)

{

this.percentage = percentage;

setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));

updateUI();

}

public void decrease(int percentage)

{

this.percentage = percentage;

setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));

updateUI();

}

public Dimension getMinimumSize()

{

return getPreferredSize();

}

public Dimension getMaximumSize()

{

return getPreferredSize();

}

}

regards

Aniruddha

Aniruddha-Herea at 2007-7-12 18:10:30 > top of Java-index,Desktop,Core GUI APIs...
# 2

Your approach looks simple and works better, but it isnt exactly what I want.

1.- Value 0 = original size.

2.- Going right = increase size.

3.- Going left = decrease size.

4.- Each thick in the slidebar = same size all times.

I have made few modifications on it. Could you take a look?

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.io.File;

import java.text.NumberFormat;

import javax.imageio.ImageIO;

import javax.swing.AbstractAction;

import javax.swing.JFormattedTextField;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSlider;

import javax.swing.KeyStroke;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.text.NumberFormatter;

public class ImgResizer {

public static void main(String[] args) {

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGUI();

}

});

}

private static void createAndShowGUI() {

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame jf = new JFrame("Resize Sample");

BufferedImage bi = null;

try {

bi = ImageIO.read(new File("C://DIBC//resources//images//pruebas//leon.gif"));

} catch (Exception e) {

e.printStackTrace();

}

jf.add(new MyJPanel(bi));

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.pack();

jf.setVisible(true);

jf.setSize(500, 400);

jf.setLocation(300, 300);

}

}

class MyJPanel extends JPanel implements PropertyChangeListener, ChangeListener {

private static final longserialVersionUID= 7257283;

private static final intMIN= -30;

private static final intMAX= 30;

private static final intINIT= 0;

private static final StringLBL= "Resize value";

private JFormattedTextFieldfield;

private JSliderslider;

private JPicturepicture;

private intcurrentValue= INIT;

public MyJPanel(BufferedImage bi) {

//Etiqueta

JLabel label = new JLabel(LBL);

//Campo de entrada num閞ico

NumberFormatter numberFormatter = new NumberFormatter(NumberFormat.getIntegerInstance());

numberFormatter.setMinimum(new Integer(MIN));

numberFormatter.setMaximum(new Integer(MAX));

field = new JFormattedTextField(numberFormatter);

field.setValue(new Integer(INIT));

field.setColumns(5); //ancho del campo

field.addPropertyChangeListener(this);

//Reacci髇 a la pulsaci髇 de 'Enter'

field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "check");

field.getActionMap().put("check", new AbstractAction() {

private static final longserialVersionUID= 4892774;

public void actionPerformed(ActionEvent e) {

if (!field.isEditValid()) { //contenido invalido

Toolkit.getDefaultToolkit().beep();

field.selectAll();

} else {

try { //contenido v醠ido

field.commitEdit(); //se usa

} catch (java.text.ParseException exc) {

}

}

}

});

//Barra desplazamiento

slider = new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);

slider.addChangeListener(this);

slider.setMajorTickSpacing(10);

slider.setMinorTickSpacing(1);

slider.setPaintTicks(true);

slider.setPaintLabels(true);

//Subpanel para la etiqueta y el campo

JPanel panelCampo = new JPanel();

panelCampo.add(label);

panelCampo.add(field);

//Subpanel para los iconos y la barra de desplazamiento

JPanel panelBarra = new JPanel();

panelBarra.add(new JLabel("min"));

panelBarra.add(slider);

panelBarra.add(new JLabel("max"));

picture = new JPicture(bi);

setLayout(new BorderLayout());

//Montamos los paneles

JPanel l_pnlTop = new JPanel();

l_pnlTop.add(panelCampo);

l_pnlTop.add(panelBarra);

add(l_pnlTop, BorderLayout.NORTH);

add(new JScrollPane(picture), BorderLayout.CENTER);

}

public void stateChanged(ChangeEvent evt) {

JSlider slider = (JSlider) evt.getSource();

int valor = (int) slider.getValue();

if (!slider.getValueIsAdjusting()) { //done adjusting

field.setValue(new Integer(valor)); //update ftf value

} else { //value is adjusting; just set the text

field.setText(String.valueOf(valor));

}

}

public void propertyChange(PropertyChangeEvent evt) {

if ("value".equals(evt.getPropertyName())) {

Number valor = (Number) evt.getNewValue();

if (slider != null && valor != null) {

int newValue = valor.intValue();

slider.setValue(newValue);

if (newValue > currentValue) {

System.out.println("+");

picture.adjustSize(newValue, true);

} else {

System.out.println("-");

picture.adjustSize(newValue, false);

}

currentValue = newValue;

}

}

}

}

class JPicture extends JLabel {

private static final long serialVersionUID = 3348221;

BufferedImage bi;

int w, h;

public JPicture(BufferedImage bi) {

this.bi = bi;

this.w = bi.getWidth();

this.h = bi.getHeight();

setPreferredSize(new Dimension(w, h));

}

protected void paintComponent(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

g2.drawImage(bi, 0, 0, w, h, this);

}

public void adjustSize(int percentage, boolean increasing) {

//setPreferredSize(new Dimension(w, h)); Is this necessary?

percentage = Math.abs(percentage);

double escalaW = (percentage * w) / 100;

double escalaH = (percentage * h) / 100;

if (increasing) {

w = (int) (w + escalaW);

h = (int) (h + escalaH);

} else {

w = (int) (w - escalaW);

h = (int) (h - escalaH);

}

updateUI();

}

/*

Is this necessary?

public Dimension getMinimumSize() {

return getPreferredSize();

}

public Dimension getMaximumSize() {

return getPreferredSize();

}

*/

}

Thanks!

JLuisa at 2007-7-12 18:10:30 > top of Java-index,Desktop,Core GUI APIs...
# 3

hi!

i made a change to add a scrollpane.

package com.ani;

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.io.File;

import java.text.NumberFormat;

import javax.imageio.ImageIO;

import javax.swing.AbstractAction;

import javax.swing.JFormattedTextField;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSlider;

import javax.swing.KeyStroke;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.text.NumberFormatter;

public class ImgResizer

{

public static void main(String[] args)

{

javax.swing.SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

createAndShowGUI();

}

});

}

private static void createAndShowGUI()

{

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame jf = new JFrame("Resize Sample");

BufferedImage bi = null;

try

{

bi = ImageIO.read(new File(

"C:/Documents and Settings/Administrator/My Documents/My Pictures/Bijoychowdhury06.jpg"));

}

catch (Exception e)

{

e.printStackTrace();

}

jf.add(new MyJPanel(bi));

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.pack();

jf.setVisible(true);

jf.setSize(500, 500);

jf.setLocation(300, 300);

}

}

class MyJPanel extends JPanel implements PropertyChangeListener, ChangeListener

{

private static final longserialVersionUID= 7257283;

private static final intMIN= -75;

private static final intMAX= 75;

private static final intINIT= 0;

private static final StringLBL= "Resize value";

private JFormattedTextFieldfield;

private JSliderslider;

private JPicturepicture;

private intcurrentValue= INIT;

public MyJPanel(BufferedImage bi)

{

//Etiqueta

JLabel label = new JLabel(LBL);

//Campo de entrada num閞ico

NumberFormatter numberFormatter = new NumberFormatter(NumberFormat

.getIntegerInstance());

numberFormatter.setMinimum(new Integer(MIN));

numberFormatter.setMaximum(new Integer(MAX));

field = new JFormattedTextField(numberFormatter);

field.setValue(new Integer(INIT));

field.setColumns(5); //ancho del campo

field.addPropertyChangeListener(this);

//Reacci髇 a la pulsaci髇 de 'Enter'

field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),

"check");

field.getActionMap().put("check", new AbstractAction()

{

private static final longserialVersionUID= 4892774;

public void actionPerformed(ActionEvent e)

{

if (!field.isEditValid())

{ //contenido invalido

Toolkit.getDefaultToolkit().beep();

field.selectAll();

}

else

try

{ //contenido v醠ido

field.commitEdit(); //se usa

}

catch (java.text.ParseException exc)

{

}

}

});

//Barra desplazamiento

slider = new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);

slider.addChangeListener(this);

slider.setMajorTickSpacing(10);

slider.setMinorTickSpacing(1);

slider.setPaintTicks(true);

slider.setPaintLabels(true);

//Subpanel para la etiqueta y el campo

JPanel panelCampo = new JPanel();

panelCampo.add(label);

panelCampo.add(field);

//Subpanel para los iconos y la barra de desplazamiento

JPanel panelBarra = new JPanel(new BorderLayout());

panelBarra.add(new JLabel("min"), BorderLayout.WEST);

panelBarra.add(slider, BorderLayout.CENTER);

panelBarra.add(new JLabel("max"), BorderLayout.EAST);

picture = new JPicture(bi);

setLayout(new BorderLayout());

//Montamos los paneles

JPanel l_pnlTop = new JPanel(new BorderLayout());

l_pnlTop.add(panelCampo, BorderLayout.WEST);

l_pnlTop.add(panelBarra, BorderLayout.CENTER);

add(l_pnlTop, BorderLayout.NORTH);

add(new JScrollPane(picture), BorderLayout.CENTER);

}

public void stateChanged(ChangeEvent evt)

{

JSlider slider = (JSlider) evt.getSource();

int valor = (int) slider.getValue();

if (!slider.getValueIsAdjusting())

{ //done adjusting

field.setValue(new Integer(valor)); //update ftf value

}

else

{ //value is adjusting; just set the text

field.setText(String.valueOf(valor));

}

}

public void propertyChange(PropertyChangeEvent evt)

{

if ("value".equals(evt.getPropertyName()))

{

Number valor = (Number) evt.getNewValue();

if (slider != null && valor != null)

{

int newValue = valor.intValue();

slider.setValue(newValue);

if (newValue > currentValue)

{

picture.increase(newValue);

}

else

{

picture.decrease(newValue);

}

currentValue = newValue;

}

}

}

}

class JPicture extends JLabel

{

private static final longserialVersionUID= 3348221;

BufferedImagebi;

int percentage;

public JPicture(BufferedImage bi)

{

setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));

this.bi = bi;

}

protected void paintComponent(Graphics g)

{

Graphics2D g2 = (Graphics2D) g;

g2.drawImage(bi, 0, 0, getPreferredSize().width, getPreferredSize().height, this);

}

public Dimension getPreferredSize()

{

int w = bi.getWidth();

int h = bi.getHeight();

double escalaW = (percentage * w) / 100;

double escalaH = (percentage * h) / 100;

int newW = (int) (w + escalaW);

int newH = (int) (h + escalaH);

return new Dimension(newW, newH);

}

public void increase(int percentage)

{

this.percentage = percentage;

updateUI();

}

public void decrease(int percentage)

{

this.percentage = percentage;

updateUI();

}

public Dimension getMinimumSize()

{

return getPreferredSize();

}

public Dimension getMaximumSize()

{

return getPreferredSize();

}

}

you can make required changes with your last code.. that is also perfect, this is just for the new feature.

regards

Aniruddha

Aniruddha-Herea at 2007-7-12 18:10:30 > top of Java-index,Desktop,Core GUI APIs...
# 4

Your last code -with few addjustments- fully satisfies my requirements.

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.io.File;

import java.text.NumberFormat;

import javax.imageio.ImageIO;

import javax.swing.AbstractAction;

import javax.swing.JFormattedTextField;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSlider;

import javax.swing.KeyStroke;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.text.NumberFormatter;

public class ImgResizer {

public static void main(String[] args) {

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGUI();

}

});

}

private static void createAndShowGUI() {

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame jf = new JFrame("Resize Sample");

BufferedImage bi = null;

try {

bi = ImageIO.read(new File("C://DIBC//resources//images//pruebas//p1.gif"));

} catch (Exception e) {

e.printStackTrace();

}

jf.add(new MyJPanel(bi));

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.pack();

jf.setVisible(true);

jf.setSize(500, 500);

jf.setLocation(300, 300);

}

}

class MyJPanel extends JPanel implements PropertyChangeListener, ChangeListener {

private static final longserialVersionUID= 7257283;

private static final intMIN= -75;

private static final intMAX= 75;

private static final intINIT= 0;

private static final StringLBL= "Resize value";

private JFormattedTextFieldfield;

private JSliderslider;

private JPicturepicture;

public MyJPanel(BufferedImage bi) {

//Etiqueta

JLabel label = new JLabel(LBL);

//Campo de entrada num閞ico

NumberFormatter numberFormatter = new NumberFormatter(NumberFormat

.getIntegerInstance());

numberFormatter.setMinimum(new Integer(MIN));

numberFormatter.setMaximum(new Integer(MAX));

field = new JFormattedTextField(numberFormatter);

field.setValue(new Integer(INIT));

field.setColumns(5); //ancho del campo

field.addPropertyChangeListener(this);

//Reacci髇 a la pulsaci髇 de 'Enter'

field.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "check");

field.getActionMap().put("check", new AbstractAction() {

private static final longserialVersionUID= 4892774;

public void actionPerformed(ActionEvent e) {

if (!field.isEditValid()) { //contenido invalido

Toolkit.getDefaultToolkit().beep();

field.selectAll();

} else {

try { //contenido v醠ido

field.commitEdit(); //se usa

} catch (java.text.ParseException exc) {

}

}

}

});

//Barra desplazamiento

slider = new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);

slider.addChangeListener(this);

slider.setMajorTickSpacing(10);

slider.setMinorTickSpacing(1);

slider.setPaintTicks(true);

slider.setPaintLabels(true);

//Subpanel para la etiqueta y el campo

JPanel panelCampo = new JPanel();

panelCampo.add(label);

panelCampo.add(field);

//Subpanel para los iconos y la barra de desplazamiento

JPanel panelBarra = new JPanel(new BorderLayout());

panelBarra.add(new JLabel("min"), BorderLayout.WEST);

panelBarra.add(slider, BorderLayout.CENTER);

panelBarra.add(new JLabel("max"), BorderLayout.EAST);

picture = new JPicture(bi);

setLayout(new BorderLayout());

//Montamos los paneles

JPanel l_pnlTop = new JPanel(new BorderLayout());

l_pnlTop.add(panelCampo, BorderLayout.WEST);

l_pnlTop.add(panelBarra, BorderLayout.CENTER);

add(l_pnlTop, BorderLayout.NORTH);

add(new JScrollPane(picture), BorderLayout.CENTER);

}

public void stateChanged(ChangeEvent evt) {

JSlider slider = (JSlider) evt.getSource();

int valor = (int) slider.getValue();

if (!slider.getValueIsAdjusting()) { //done adjusting

field.setValue(new Integer(valor)); //update ftf value

} else { //value is adjusting; just set the text

field.setText(String.valueOf(valor));

}

}

public void propertyChange(PropertyChangeEvent evt) {

if ("value".equals(evt.getPropertyName())) {

Number valor = (Number) evt.getNewValue();

if (slider != null && valor != null) {

int newValue = valor.intValue();

slider.setValue(newValue);

picture.updateSize(newValue);

}

}

}

}

class JPicture extends JLabel {

private static final long serialVersionUID = 3348221;

BufferedImage bi;

int percentage;

public JPicture(BufferedImage bi) {

setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));

this.bi = bi;

}

protected void paintComponent(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

g2.drawImage(bi, 0, 0, getPreferredSize().width, getPreferredSize().height, this);

}

public Dimension getPreferredSize() {

int w = bi.getWidth();

int h = bi.getHeight();

double escalaW = (percentage * w) / 100;

double escalaH = (percentage * h) / 100;

int newW = (int) (w + escalaW);

int newH = (int) (h + escalaH);

return new Dimension(newW, newH);

}

public void updateSize(int percentage) {

this.percentage = percentage;

updateUI();

}

public Dimension getMinimumSize() {

return getPreferredSize();

}

public Dimension getMaximumSize() {

return getPreferredSize();

}

}

Mensaje editado por:

JLuis

so, thank you very much for your help!

JLuisa at 2007-7-12 18:10:30 > top of Java-index,Desktop,Core GUI APIs...