1
votes

In the below program I want to zoomin and zoomout the image which is selected by the user.the problem is that when I zoomin or zoomout the image by clicking on zoomin zoomout button then scrollabars are not working. please help what is hte problem

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ImageProcess extends JFrame implements ActionListener {
    private JMenuItem newimage;
    private JMenuItem open;
    private Image image;
    private File file;
    private JFrame jf;
    private JPanel panel;
    private Cursor zoomCursor;

    public ImageProcess() {
        super("Image Demo");
        this.setBounds(200, 200, 100, 100);
        this.setSize(800, 800);
        this.setResizable(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container con = this.getContentPane();
        this.setVisible(true);
        JMenuBar menubar = new JMenuBar();
        this.setJMenuBar(menubar);
        JMenu file = new JMenu("File");
        newimage = new JMenuItem("New");
        open = new JMenuItem("Open");
        menubar.add(file);
        file.add(newimage);
        file.addSeparator();
        file.add(open);
        newimage.addActionListener(this);
        open.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == newimage) {
            ReadImage ri = new ReadImage();

        }
        if (e.getSource() == open) {
            OpenImage oi = new OpenImage();

        }
    }

    public static void main(String args[]) {
        ImageProcess imagepro = new ImageProcess();
    }
}

class ImageFileFilter extends javax.swing.filechooser.FileFilter {
    public boolean accept(File file) {
        if (file.isDirectory())
            return false;
        String name = file.getName().toLowerCase();
        return (name.endsWith(".jpg") || name.endsWith(".png") || name
                .endsWith(".gif"));
    }

    public String getDescription() {
        return "Images (*.gif,*.bmp, *.jpg, *.png )";
    }
}

class ReadImage extends JFrame {
    File file;
    JFileChooser chooser;

    public ReadImage() {
        chooser = new JFileChooser();
        chooser.setMultiSelectionEnabled(false);

        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        int returnVal = chooser.showOpenDialog(ReadImage.this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = chooser.getSelectedFile();
            try {
                final BufferedImage bi = ImageIO.read(file);
                Canvas can = new Canvas() {
                    public void paint(Graphics g) {
                        Graphics2D g2d = (Graphics2D) g;
                        g2d.drawImage(bi, 0, 0, this);
                    }
                };
                this.getContentPane().add(can);
                can.setPreferredSize(new Dimension(bi.getWidth(), bi
                        .getHeight()));
                this.pack();
                this.setVisible(true);
            } catch (IOException ie) {
                ie.printStackTrace();
            }
        }
    }
  
}

class OpenImage extends JFrame implements ActionListener {
    private JFileChooser chooser;
    private File file;
    private JFrame jf;
    Canvas can;
    JPanel pan;
    public JScrollPane sp;
    Dimension imgSize, iniSize;
    private JButton butIn = new JButton("ZoomIN");
    private JButton butOut = new JButton("ZoomOUT");
    private JButton butReset = new JButton("Reset");

    public OpenImage() {
        chooser = new JFileChooser();
        chooser.setCurrentDirectory(new File("."));
        chooser.addChoosableFileFilter(new ImageFileFilter());
        int returnVal = chooser.showOpenDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = chooser.getSelectedFile();
            String filename = file.getName();
            try {
                final BufferedImage bi = ImageIO.read(file);
                imgSize = iniSize = new Dimension(bi.getWidth(), bi.getHeight());
                jf = new JFrame();
                this.setResizable(false);
                this.setTitle(filename);
                pan = new JPanel();
                pan.add(butIn);
                pan.add(butOut);
                // pan.add(butReset);
                butIn.addActionListener(this);
                butOut.addActionListener(this);
                butReset.addActionListener(this);

                can = new Canvas() {
                    public void paint(Graphics g) {
                        Graphics2D g2d = (Graphics2D) g;
                        if (imgSize.width = iniSize.width) {
            can.setSize(imgSize);
        }
        can.repaint();
        can.validate();
    }

    public void zoomOUT() {
        if (!(getWidth() > imgSize.width)) {
            int x = 10 * imgSize.width / 100;
            int y = 10 * imgSize.height / 100;

            imgSize = new Dimension(imgSize.width - x, imgSize.height - y);
            if (getWidth() >= iniSize.width + 50) {
                can.setSize(imgSize);
            }
            can.repaint();
            can.validate();
        } else {
            repaint();
        }
    }

}
2
really for deepest debuging :-)mKorbel
There is something missing from your code starting line 156Bernd Elkemann

2 Answers

5
votes

Don't mix swing JScrollPane and awt Canvas. Use e.g. JPanel and paintComponent() method.

3
votes

if you don't required/expected for your project to use some special fearutes for ImageProcesing, Video..., then concider that using Canvas is useless and maybe best way how to dispay Icon/ImageIcon is JLabel with built-in all features for painting Pictures in Swing without using paint()/paintComponent() for that, here is example for JFileChoser/JScrollPane/Image plus useless RotatableImage