简体   繁体   English

用于缩放图像的摇摆滚动条

[英]Swing scrollbar for scaled image

I have created a custom JSlider that is used to zoom in and out on an image. 我创建了一个自定义JSlider ,用于放大和缩小图像。 I want to add a scroll bar when the image becomes to large to fit into my 400x400 frame so that the user is able to pan across the image, there should not be a scroll bar if the image fits the frame. 我想在图像变大以适应我的400x400帧时添加滚动条,以便用户能够平移图像,如果图像适合帧,则不应该有滚动条。 I am very new to Swing so any help would be greatly appreciated I cant seem to get anything to work. 我对Swing很新,所以任何帮助都会非常感激我似乎无法工作。

public class GraphicsOnly extends JComponent implements ChangeListener {  
JPanel gui;
/** Displays the image. */
JLabel imageCanvas;
Dimension size;  
double scale = 1.0;  
private BufferedImage image;




public GraphicsOnly() {  
    size = new Dimension(10,10);  
    setBackground(Color.black);  
    try {                
        image = ImageIO.read(new File("car.jpg"));

     } catch (IOException ex) {

     }
}  

public void setImage(Image image) {
    imageCanvas.setIcon(new ImageIcon(image));
}



public void initComponents() {
    if (gui==null) { 
        gui = new JPanel(new BorderLayout());
        gui.setBorder(new EmptyBorder(5,5,5,5));
        imageCanvas = new JLabel();
        JPanel imageCenter = new JPanel(new GridBagLayout());
        imageCenter.add(imageCanvas);
        JScrollPane imageScroll = new JScrollPane(imageCenter);
        imageScroll.setPreferredSize(new Dimension(300,100));
        gui.add(imageScroll, BorderLayout.CENTER);
    }
}



public Container getGui() {
    initComponents();
    return gui;
}



public void stateChanged(ChangeEvent e) {  
    int value = ((JSlider)e.getSource()).getValue();  
    scale = value/100.0;  
    repaint();  
    revalidate();  
}  


 protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     Graphics2D g2 = (Graphics2D)g;  
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  
             RenderingHints.VALUE_ANTIALIAS_ON); 
     int w = getWidth();  
     int h = getHeight();  
     int imageWidth = image.getWidth();  
     int imageHeight = image.getHeight();  
     double x = (w - scale * imageWidth)/2;  
     double y = (h - scale * imageHeight)/2;  
     AffineTransform at = AffineTransform.getTranslateInstance(x,y);  
     at.scale(scale, scale);  
     g2.drawRenderedImage(image, at);  
     setImage(image);

 }


public Dimension getPreferredSize() {  
    int w = (int)(scale*size.width);  
    int h = (int)(scale*size.height);  
    return new Dimension(w, h);  
}  



private JSlider getControl() {  
    JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 500, 50);  
    slider.setMajorTickSpacing(50);  
    slider.setMinorTickSpacing(25);  
    slider.setPaintTicks(true);  
    slider.setPaintLabels(true);  
    slider.addChangeListener(this);  
    return slider;          
}  


public static void main(String[] args) {  
    GraphicsOnly app = new GraphicsOnly();  
    JFrame frame = new JFrame();  
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    frame.setContentPane(app.getGui());
    app.setImage(app.image);

   // frame.getContentPane().add(new JScrollPane(app));  
    frame.getContentPane().add(app.getControl(), "Last");  
    frame.setSize(700, 500);  
    frame.setLocation(200,200);  
    frame.setVisible(true);  
} 
}  

This version works. 这个版本有效。 There were a number of problems with the attempt seen above, including that it was now mixing component painting with custom painting. 上面的尝试存在许多问题,包括它现在将组件绘画与自定义绘画混合在一起。 I adapted the paintComponent method to instead paint a scaled image. 我改为使用paintComponent方法绘制缩放图像。

在此输入图像描述

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.*;

import java.net.URL;
import javax.imageio.ImageIO;

public class GraphicsOnly extends JComponent implements ChangeListener {

    JPanel gui;
    /**
     * Displays the image.
     */
    JLabel imageCanvas;
    Dimension size;
    double scale = 1.0;
    private BufferedImage image;

    public GraphicsOnly() {
        size = new Dimension(10, 10);
        setBackground(Color.black);
        try {
            image = ImageIO.read(new URL("http://i.stack.imgur.com/7bI1Y.jpg"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void setImage(Image image) {
        imageCanvas.setIcon(new ImageIcon(image));
    }

    public void initComponents() {
        if (gui == null) {
            gui = new JPanel(new BorderLayout());
            gui.setBorder(new EmptyBorder(5, 5, 5, 5));
            imageCanvas = new JLabel();
            JPanel imageCenter = new JPanel(new GridBagLayout());
            imageCenter.add(imageCanvas);
            JScrollPane imageScroll = new JScrollPane(imageCenter);
            imageScroll.setPreferredSize(new Dimension(300, 100));
            gui.add(imageScroll, BorderLayout.CENTER);
        }
    }

    public Container getGui() {
        initComponents();
        return gui;
    }

    public void stateChanged(ChangeEvent e) {
        int value = ((JSlider) e.getSource()).getValue();
        scale = value / 100.0;
        paintImage();
    }

    protected void paintImage() {
        int w = getWidth();
        int h = getHeight();
        int imageWidth = image.getWidth();
        int imageHeight = image.getHeight();
        BufferedImage bi = new BufferedImage(
                (int)(imageWidth*scale), 
                (int)(imageHeight*scale), 
                image.getType());
        Graphics2D g2 = bi.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        double x = (w - scale * imageWidth) / 2;
        double y = (h - scale * imageHeight) / 2;
        AffineTransform at = AffineTransform.getTranslateInstance(0, 0);
        at.scale(scale, scale);
        g2.drawRenderedImage(image, at);
        setImage(bi);
    }

    public Dimension getPreferredSize() {
        int w = (int) (scale * size.width);
        int h = (int) (scale * size.height);
        return new Dimension(w, h);
    }

    private JSlider getControl() {
        JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 500, 50);
        slider.setMajorTickSpacing(50);
        slider.setMinorTickSpacing(25);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.addChangeListener(this);
        return slider;
    }

    public static void main(String[] args) {
        GraphicsOnly app = new GraphicsOnly();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(app.getGui());
        app.setImage(app.image);

        // frame.getContentPane().add(new JScrollPane(app));  
        frame.getContentPane().add(app.getControl(), "Last");
        frame.setSize(700, 500);
        frame.setLocation(200, 200);
        frame.setVisible(true);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM