Java 如何使用JScrollBar缩放图像?

Java 如何使用JScrollBar缩放图像?,java,image,swing,zooming,jscrollbar,Java,Image,Swing,Zooming,Jscrollbar,我想使用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, he

我想使用
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);

       }
     });
  }

}

你的代码中有很多错误。它需要全面反思

我只给你一些基本的提示:

  • 使用未设置侦听器的
    ImagePanel
    构造函数(注意
    NullPointerException
  • 您没有缩放图像-在
    paintComponent
    上,您只是按原样绘制图像
  • 您正在侦听器滚动值中添加
    宽度
    高度
    ,并尝试在
    画图组件
    中重置它们-这不是您应该做的。提示:有一种
    Graphics
    class的方法:
    g.drawImage(image,x,y,width,height,this)
    
  • 必须在EDT上创建和更改每个Swing组件:


我更改了一些代码,然后我不知道该怎么办,你能再帮我一次吗?>
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            JFrame frame = new JFrame();
            //etc.
        }
    });
}