Question

I am attempting to create a program that uses a slider too zoom in on an Image. I have got it working with rectangles and circles but when I try to add Images, they display but when I slide the slider, they do not zoom in it only translates or moves it diagonally across the screen, not re sizing it at all. Can someone Help me fix this? Here is my code:

import javax.swing.*;


public class Parker
{
    public static void main(String[] args)
    {

        TheWindow w = new TheWindow();
        w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X wont close the window with out this line
        w.setSize(375,375);
        w.setVisible(true);
    }

}



import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;


public class TheWindow extends JFrame
{
    private JSlider slider; //declare slider
    private drawRect myPanel; //declare/ create panel


    public TheWindow()
    {
        super("Slider Example"); //make title
        myPanel = new drawRect();
        myPanel.setBackground(Color.cyan); //change background color

        slider = new JSlider(SwingConstants.VERTICAL, 0, 315, 10);// restrains the slider from scaling square to 0-300 pixels
        slider.setMajorTickSpacing(20); //will set tick marks every 10 pixels
        slider.setPaintTicks(true); //this actually paints the ticks on the screen

        slider.addChangeListener
        (
            new ChangeListener()
            {
                public void stateChanged(ChangeEvent e)
                {
                    myPanel.setD(slider.getValue()); //Wherever you set the slider, it will pass that value and that will paint on the screen
                }
            }

        );

        add(slider, BorderLayout.WEST); //similar to init method, adds slider and panel to GUI
        add(myPanel, BorderLayout.CENTER);


    }






}




import java.awt.*;
import javax.swing.*;

public class drawRect extends JPanel
{

    private int d = 20; //this determines the beginning size of the rect. 

    public void paintComponent(Graphics g)//paints obj on the screen
    {
        super.paintComponent(g); //prepares graphic object for drawing

        ImageIcon i = new ImageIcon("A:\\Capture.png"); //location of Image
        i.paintIcon(this, g, d, d); //paints icon on screen

        int originX = getWidth() / 2; //this is subtracting half of 'd' from the center point to scale it form the center
        int originY = getHeight() / 2;

        int x = originX - (d / 2);
        int y = originY - (d / 2);
        System.out.println(x + "x" + y);

       // g.fillRect(x, y, d, d); //paints rectangle on screen
        //x , y, width, height      
    }           

    public void setD(int newD)
    {
        d = (newD >= 0 ? newD : 10); //if number is less than zero it will use 10 for diameter(compressed if statement)
        repaint();

    }

    public Dimension getPrefferedSize()
    {

        return new Dimension(200, 200);     
    }

    public Dimension getMinimumSize()
    {
        return getPrefferedSize();
    }

}
Was it helpful?

Solution

Here is the method to re-size the Image. Fit it in your code.

public BufferedImage resizeImage(Image originalImage, int newD) throws IOException {
    BufferedImage resizedImage = new BufferedImage(newD, newD,
            BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, newD, newD, null);
    g.dispose();
    return resizedImage;
}

--EDIT--

Favor Composition over Inheritance.

Don't extend any class until and unless you are overriding the existing logic.

complete sample code:

class drawRect {

    private Image image;
    private JLabel label;

    public JLabel getLabel() {
        return label;
    }

    public drawRect() {
        try {
            label = new JLabel();
            image = ImageIO.read(new File("resources/1.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        setD(10);
    }

    public void setD(int newD) {
        int d = (newD >= 0 ? newD : 10);

        try {
            label.setIcon(new ImageIcon(resizeImage(image, d)));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private BufferedImage resizeImage(Image originalImage, int newD) throws IOException {
        BufferedImage resizedImage = new BufferedImage(newD, newD, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, newD, newD, label);
        g.dispose();
        return resizedImage;
    }

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top