【问题标题】:Swing scrollbar for scaled image缩放图像的摆动滚动条
【发布时间】:2015-01-01 08:35:11
【问题描述】:

我创建了一个自定义JSlider,用于放大和缩小图像。当图像变得太大以适合我的 400x400 框架时,我想添加一个滚动条,以便用户能够平移图像,如果图像适合框架,则不应有滚动条。我对 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);  
} 
}  

【问题讨论】:

  • 将图像缩放为新图像,并将缩放后的图像显示在滚动窗格的标签中,一切都会自行处理。
  • try { image = ImageIO.read(new File("car.jpg")); } catch (IOException ex) { } 当(不是如果)失败时,调试它的人将受益于该 catch 块中的ex.printStackTrace();(或者更好的是,日志记录)..
  • 参见ImageViewer,了解第一条评论中概述的方法示例。
  • 好的,谢谢,我会试试的
  • 我已经更改了我的代码并实现了 Jlabel。它现在可以正确显示图像,如果我缩小窗口,滚动条会按需要显示,但是现在我的自定义滑块没有放大和缩小图像,我不知道为什么......?

标签: java swing scrollbar jscrollpane jscrollbar


【解决方案1】:

此版本有效。上面看到的尝试存在许多问题,包括它现在将组件绘画与自定义绘画混合在一起。我调整了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);
    }
}

【讨论】:

  • 非常感谢现在更有意义了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多