Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于缩放图像的旋转滚动条_Java_Swing_Scrollbar_Jscrollpane_Jscrollbar - Fatal编程技术网

Java 用于缩放图像的旋转滚动条

Java 用于缩放图像的旋转滚动条,java,swing,scrollbar,jscrollpane,jscrollbar,Java,Swing,Scrollbar,Jscrollpane,Jscrollbar,我创建了一个自定义的JSlider,用于放大和缩小图像。我想在图像变大以适合我的400x400帧时添加一个滚动条,以便用户能够在图像上平移,如果图像适合帧,则不应该有滚动条。我对Swing很陌生,所以如果能得到任何帮助,我将不胜感激,因为我似乎什么都做不到 public class GraphicsOnly extends JComponent implements ChangeListener { JPanel gui; /** Displays the image. */ JLabel

我创建了一个自定义的
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);  
} 
}  

这个版本有效。上面看到的尝试有很多问题,包括现在将组件绘制与自定义绘制混合在一起。我采用了
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);
    }
}


将图像缩放为新图像,并在滚动窗格中的标签中显示缩放后的图像,所有内容都会自行处理。
尝试{image=ImageIO.read(new File(“car.jpg”);}catch(IOException ex){}
如果失败,调试它的人将受益于
ex.printStackTrace()在该catch块中(或者更好的是,记录)…有关第一条注释中概述的方法的示例,请参见。好的,谢谢,我将尝试一下。我已经更改了代码并实现了Jlabel。它现在正确地显示图像,如果我缩小窗口,滚动条会按需要显示,但是现在我的自定义滑块没有在图像上放大和缩小,我不知道为什么…?非常感谢,现在更有意义了!