2011-08-10 15 views
0

以下のプログラムでは、ユーザーが選択した画像をズームインしてズームアウトしたいのですが、ズームインまたはズームアウトするときにズームインボタンをクリックするとスクロールバーが機能しません。何か問題を解決してくださいキャンバスのスクロールペインを設定する際の問題

 
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 Canvasを混在させないでください。例えばJPanelとpaintComponent()メソッドその後、

+0

を開始します。コードから欠落しているものがありますが、私はキャンバスのみを使用しなければなりません。今度は、キャンバスを持つフレームに使用されているすべてのコンポーネントをコンポーネントに変更します。今私は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

あなたが必要/ ImageProcesing、ビデオのためにいくつかの特別なfearutesを使用するには、プロジェクトのために期待していない場合は...、Canvasを使用することは無用であると多分Icon/ImageIconをdispayする最善の方法を 方法は、内蔵したJLabelであることをconcider塗料を使用せずに、スイング中の写真を塗るためのすべての機能()/ paintComponent()そのため、ここでは一例であるJFileChoser/JScrollPane/Imageプラス無用RotatableImage

関連する問題