0

画像のズームインとズームアウトに使用したいのですJScrollBarが、うまくいきません。コードの何が問題になっていますか?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

 public class piczoominandout extends JFrame
{
  public JScrollBar scroll;
  public JLabel lbl;
  public Image image;
  public int x, y, width, height;

  public piczoominandout()
 {
   super("picture zoom");
   Toolkit toolkit = Toolkit.getDefaultToolkit();
   image = toolkit.getImage("Snake.jpg");
   Container c = getContentPane();
   ImagePanel imagePane = new ImagePanel(image);

   c.setLayout(new BorderLayout());
   lbl = new JLabel("0");
   c.add(lbl, BorderLayout.SOUTH);
   scroll = new JScrollBar(
           JScrollBar.HORIZONTAL,50,10,0,100);
   scroll.addAdjustmentListener(new AdjustmentListener() {
     public void adjustmentValueChanged(
                         AdjustmentEvent evt) {
        JScrollBar s = (JScrollBar)evt.getSource();
        if ( !s.getValueIsAdjusting() ) {
           int v = (int)s.getValue();
           width +=v;
           height +=v;

           repaint();
           lbl.setText(Integer.toString(v));
        }
     } });
    c.add(imagePane,BorderLayout.CENTER );

    c.add(scroll, BorderLayout.NORTH);
 }
 class ImagePanel extends JPanel
 {
  public ImagePanel(Image img) { image = img;}
  public void paintComponent(Graphics g)
  {
   Insets ins = getInsets();
   super.paintComponent(g);
   width = image.getWidth(this);
   height = image.getHeight(this);
   x = ins.left+5; y = ins.top+5;
   g.drawImage(image,x,y,width,height,this);
  }
 }

  public static void main(String[] args)
  {
   SwingUtilities.invokeLater(new Runnable() {
     public void run()
     {
      piczoominandout frame = new piczoominandout();
      frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
      frame.setSize(600,300);
      frame.setVisible(true);

       }
     });
  }

}
4

1 に答える 1

1

あなたのコードには非常に多くのエラーがあります。全般的な再考が必要です。

基本的なヒントのみをいくつか紹介します。

  • ImagePanelリスナーを設定しないコンストラクターを使用します(注意してくださいNullPointerException)。
  • 画像をスケーリングしていません-paintComponent画像をそのままペイントするだけです。
  • リスナーのスクロール値に追加してwidth、それらをリセットしようとしています-これはすべきことではありません。ヒント: class:のメソッドがあります。heightpaintComponentGraphicsg.drawImage(image, x, y, width, height, this);
  • すべての Swing コンポーネントは、EDT で作成および変更する必要があります。

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame frame = new JFrame();
            //etc.
        }
    });
}
于 2012-07-31T13:28:45.110 に答える