2011-08-10 109 views
0

在下面的程序中,我想縮放和縮小用戶選擇的圖像。問題是,當我通過單擊縮放縮放按鈕縮放或縮小圖像,然後scrollabars不起作用。請大家幫忙什麼興田問題設置畫布滾動條的問題

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

} 
+0

真的是最深的調試運行:-) – mKorbel

+2

也有一些是從您的代碼起跑線156 –

回答

4

請勿混用JScrollPane的擺動和AWT畫布。使用例如JPanel和paintComponent()方法。

+0

失蹤,但我只能使用畫布,現在我更改了畫布中使用的所有組件,這些組件具有awt組件。現在我正在使用ScrollPane,只有水平滾動工作,可以請你告訴我啓用垂直滾動我要做什麼我創建ScrollPane的構造函數如下ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); –

+0

http://download.oracle.com/javase/6/docs/api/javax/swing/JScrollPane.html#setHorizo​​ntalScrollBar%28javax.swing.JScrollBar%29 – mKorbel

+0

@ user571616:請說明您必須使用的限制只有畫布「。如果我們知道這是爲什麼,我們可能會更好地幫助你。 –

3

,如果你不需要做/預期爲您的項目使用一些特殊fearutes爲ImageProcesing,視頻...,然後海外商品會有,使用Canvas是無用的,也許最好的辦法 如何dispay Icon/ImageIconJLabel帶有內置換畫Swing中的圖片,而無需使用paint()方法的所有功能/的paintComponent()來,我這裏是爲JFileChoser/JScrollPane/Image加沒用RotatableImage