import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;public class TransformTest
{  
public static void main(String[] args)
   {  
JFrame frame = new TransformTestFrame();
frame.show();
   }
}class TransformTestFrame extends JFrame implements ActionListener

private JScrollPane span = null;
private TransformPanel canvas;
private JRadioButton rotateButton;
private JButton zoomoutButton;
private JButton zoominButton;
private JButton normalButton;
public double x=1,y=1;
public TransformTestFrame()
{  
setTitle("TransformTest");
setSize(400, 300);
addWindowListener(new WindowAdapter(){ 
public void windowClosing(WindowEvent e)
{  
System.exit(0);
}
} );
Container contentPane = getContentPane();
canvas = new TransformPanel();
span = new JScrollPane(canvas);
span.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
span.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
span.setAutoscrolls(true);
JPanel buttonPanel = new JPanel();
contentPane.add(buttonPanel, "North");
  }
   
class TransformPanel extends JPanel

private Image img = Toolkit.getDefaultToolkit().getImage("d:/Sunset.jpg");
public double x,y;
public TransformPanel()
{   
t = new AffineTransform();
}
public void paintComponent(Graphics g)

super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.drawImage(img,0,0,getWidth(),getHeight(), this);
}
}为什么JSCrollpane 对图片(用paint方法)不起作用,而对ImageIcon有作用
怎么使在第一种显示图片内的JSCrollPane起作用
我想实现的效果就是像photoshop里放大缩小,同时还可以拖动。。
这问题好像可以归结成canvas里怎么使JSCrollPane起作用

解决方案 »

  1.   

    Panel容器并不知道你这个图形有多大,它只负责在自己所显示出来的区域将图片的一部分描绘出来,所以Panel容器现在没有大小,它的大小是占满JScrollPane,所以你看不到滚动条,你在canvas = new TransformPanel();后面加一句canvas.setPreferredSize(new Dimension(600, 800));看看
      

  2.   

    这有个例子
    http://www.cjsdn.com/post/view?bid=46&id=139614&sty=2&tpg=4&ppg=1&age=30
      

  3.   

    同意mq612(五斗米) 的说法。但这样就限制了图片显示的大小(jpanel区域大小被限)。。
    这样我图片放大后就会只显示部分图片
    不过谢谢你的建议,谢谢!
      

  4.   

    to :mq612(五斗米)
    现在我是首先设置canvas.setPreferredSize(new  Dimension(600,  800));
    经过放大后再canvas.setPreferredSize(new  Dimension(1200,  1600));
    但为什么要先动一下边框稍微缩放才能像滚动条变长???急!谢谢
      

  5.   

    to :mq612(五斗米)
    现在我是首先设置canvas.setPreferredSize(new  Dimension(600,  800));
    经过放大后再canvas.setPreferredSize(new  Dimension(1200,  1600));
    但为什么要先动一下边框稍微缩放才能像滚动条变长???急!谢谢
      

  6.   

    canvas.setPreferredSize(new  Dimension(1200,  1600));你重新设置了canvas的大小,并没有刷新组件的位置关系,这牵扯到了上层容器的布局管理,所以新的设置是不会显示出来的,当你一移动边框,JFrame就会对内部所有组件进行新布局管理,所有在JFrame显示后设置的组件大多数都会存在这样的问题,所以你要给canvas的上层组件进行强制布局刷新:
    validate() //使用 validate 方法会使容器再次布置其子组件。