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
# 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 >

# 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
# 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 >

