2014-11-05 125 views
4

我已經創建了用於放大和縮小圖像的自定義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); 
} 
} 
+0

縮放圖像到一個新的,並在滾動窗格中的標籤顯示的縮放圖像,一切會照顧自己。 – 2014-11-05 08:10:38

+0

'嘗試{image = ImageIO.read(new File(「car.jpg」)); } catch(IOException ex){}'當(不是如果)失敗時,調試它的人將受益於該catch塊中的ex.printStackTrace();(或者更好的是,日誌記錄)。 – 2014-11-05 08:14:08

+0

請參見[ ImageViewer'](http://stackoverflow.com/a/13463684/418556)查看第一條評論中所述方法的示例。 – 2014-11-05 08:16:57

回答

4

此版本的工作原理。上述嘗試有許多問題,包括現在將組件繪畫與自定義繪畫混合在一起。我改編了paintComponent方法來代替繪製縮放圖像。

enter image description here

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); 
    } 
} 
+0

非常感謝你讓現在更有意義! – Wheels99 2014-11-05 10:40:04