problema al configurar el panel de desplazamiento para el lienzo

En el programa de abajo, quiero acercar y alejar la imagen seleccionada por el usuario. El problema es que cuando acerco o alejo la imagen haciendo clic en el botón acercar alejar, los scrollabars no funcionan. por favor ayuda cual es el problema

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();
        }
    }

}

preguntado el 10 de agosto de 11 a las 08:08

realmente para una depuración más profunda :-) -

Falta algo en la línea de inicio 156 de su código:

2 Respuestas

No mezcle swing JScrollPane y awt Canvas. Utilice, por ejemplo, el método JPanel y paintComponent ().

Respondido 10 ago 11, 12:08

pero tengo que usar solo lienzo, ahora cambio todos los componentes usados ​​en el marco que tienen lienzo a componentes awt. Ahora estoy usando ScrollPane, y solo el desplazamiento horizontal está funcionando, ¿podría decirme para habilitar el desplazamiento vertical qué tendría que hacer? Estoy creando el constructor de ScrollPane como se muestra a continuación ScrollPane sp = new ScrollPane (ScrollPane.SCROLLBARS_ALWAYS); - agarwal_achhnera

@ user571616: explique la restricción de que "debe usar solo lienzo". Si supiéramos por qué es así, probablemente podríamos ayudarlo mejor. - Aerodeslizador lleno de anguilas

si no necesita / espera que su proyecto use algunos miedos especiales para ImageProcesing, Video ..., entonces considere que usar Canvas es inútil y tal vez la mejor manera de disparar Icono / ImageIcon is JLabel con todas las funciones integradas para pintar imágenes en Swing sin usar paint () / paintComponent () para eso, aquí hay un ejemplo para JFileChoser / JScrollPane / Imagen más RotatableImage inútil

contestado el 23 de mayo de 17 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.