2012-07-31 118 views
0

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

     } 
    }); 
    } 

} 

回答

1

代码中存在太多错误。它需要一般的反思。

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

  • 您使用ImagePanel构造器没有设置监听器(看出来NullPointerException);
  • 你不缩放图像 - 在paintComponent你只是画图像,因为它是;
  • 您正在将widthheight添加到侦听器滚动值中,并且您尝试在paintComponent中重置它们 - 这不是您应该做的。建议:有一种方法Graphics class:g.drawImage(image, x, y, width, height, this);;
  • 每个Swing组件必须创建和改变了美国东部时间:

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame frame = new JFrame(); 
      //etc. 
     } 
    }); 
} 
+0

我改变了一些代码,然后我不知道该怎么做,u能再次帮助我吗? >< – user1565659 2012-07-31 16:34:49