//显示对象为jpg,gif canvas中画图使用double buffering,使用scroll bar显示,显示区域固定了,可以扩展成按照canvas的大小来显示的模式,因为canvas放在center位置。
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
class Frameext extends Frame
{
}
public class Images extends Frame implements ActionListener, WindowListener ,WindowStateListener
{
//Frameext fr = new Frameext();
Label Label1 = new Label(" ",Label.LEFT); //will show the file name
Button Button1 = new Button("open file");
int xpos,ypos;
int imageHeight;
int w,h;
Image offimg, bg;
Graphics offg;
boolean first=true;
//extends Canvas. This code will use its paint method.
public MyCanvas Canvas1 = new MyCanvas();
static Scrollbar horizontal, vertical; //scrollbar used
FileDialog fd = new FileDialog(this,"Open", FileDialog.LOAD);
Image Image1;
public void initialize()
{
//System.out.println(" dddddd "+this.MAXIMIZED_BOTH);
//this.setLocation(0, 0);
//this.setSize(this.getToolkit().getScreenSize());
this.setSize(600,600);
this.setLocation(30,30);
this.setBackground(Color.lightGray);
Canvas1.setBackground(Color.white);
Canvas1.setSize(580,580);
//ColorChooserDialog colorDialog = new ColorChooserDialog(this, "@fff", this);
this.add ("North", horizontal = new Scrollbar (Scrollbar.HORIZONTAL));
this.add ("East", vertical = new Scrollbar (Scrollbar.VERTICAL));
Panel pa=new Panel();
pa.setBackground(Color.white);
Label1.setBackground(Color.lightGray);
Label1.setAlignment(Label.LEFT);
pa.add(Label1);
pa.add(Button1); //add label and button on panel
this.add("South",pa); //add panel at south
this.add("Center",Canvas1);
this.addWindowListener(this);
this.addWindowStateListener (this);
Button1.addActionListener(this);
try
{
System.out.println ("getsize" + Canvas1.getSize () + "getwidth" + Canvas1.getWidth () +
"getheight " + Canvas1.getHeight ());
}
catch (Exception e)
{System.out.println(e.toString());
}
this.pack();
this.show();
}
void imageload ()
{ fd.setFile("*.jpg;*.gif"); //file speicific
fd.show();
if(fd.getFile() == null)
{
Label1.setText("You have not chosen any image files yet");
}
else
{
String d = (fd.getDirectory() + fd.getFile());
Image1 = Toolkit.getDefaultToolkit().getImage(d);
if(Image1==null)
{System.out.println("image is null of this file:"+ d);
return;
}
Label1.setText(d);
System.out.println("image loaded "+d);
//It is important to use Canvas1 as the ImageObserver.
MediaTracker mt = new MediaTracker(Canvas1); //here should be noticed like the author say
mt.addImage(Image1, 0);
try
{
mt.waitForAll();
}
catch (InterruptedException e)
{
System.out.println(e.toString());
}
w = Image1.getWidth (this);
h = Image1.getHeight (this); //set w and h the image's height and width
System.out.println("image width and height is"+w+" "+h);
if (offimg != null
&& (offimg.getHeight (this) < h || offimg.getWidth (this) < w))
{ //shall we recreate the offimg for double buffering if the image is larger
System.out.println ("offimage w and h " +
offimg.getHeight (this) + " " +
offimg.getWidth (this) + " w " + w + " h " +
h);
offimg = createImage (w, h);
offg = offimg.getGraphics ();
}
vertical.setMaximum(h-390); //here important set scroll bar 's maximum
//imagesize minus (showsize minus insects size first) ,
//you can determ the insects by program or simple set the maximum to
//a certain number,and then you scroll it down and trace when it reach
//the boundary,the value does not agree with the maximum number you set
//and the difference may be the insects size you shall minus first
// vertical.setVisibleAmount((h-290)/10);
//if we try to set the visibleamount to a variable ,the scroll by will be uncertain and
//hard to contral
horizontal.setMaximum(w-440);
// horizontal.setVisibleAmount((w-390)/10);
Canvas1.repaint(); //image loaded so repaint the canvas
// Canvas1.paint();
}
}
public boolean handleEvent (Event e) {
// System.out.println("catched "+e);//we can see clearly what event happen if we don't comment this sentence
if (e.id == Event.WINDOW_DESTROY)
{
System.exit(0);
}
else if (e.target instanceof Scrollbar)
{
System.out.println(" scoll of handleevent " );
if (e.target == horizontal)
{
xpos = ((Integer)e.arg).intValue(); //trace the scroll value for image show later
}
else if (e.target == vertical)
{
ypos = ((Integer)e.arg).intValue();
}
System.out.println(" "+xpos+""+ypos); //System.out.println(" checking hereeeeeeeeeeeeeee" );
Canvas1.repaint();
}
return super.handleEvent(e);
}
public void windowStateChanged (WindowEvent e)
{
System.out.println ("window state changed");
Canvas1.repaint ();
}
public void windowClosing(WindowEvent e)
{
// Use this.hide(); for subsequent forms in multi form applications
System.exit(0);
}
public void windowActivated(WindowEvent e) {System.out.println ("window activated");Canvas1.repaint();}
public void windowClosed(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
public void actionPerformed(ActionEvent event)
{ System.out.println("catched2 "+event);
Button b = (Button)event.getSource();
if(b == Button1)
{
imageload();
}
}
public static void main(String args[])
{
Images a = new Images();
a.initialize();
}
/*
public void update(Graphics g)
{
Canvas1.update(g);
}
public void paint(Graphics g)
{
Canvas1.paint(g);
}
*/
//A simple inner class to show the basics.
class MyCanvas extends Canvas
{
public void update(Graphics g)
{
System.out.println(" update" );
if (offg != null&&Image1!=null)
{
offg.clearRect(50,50, 500,450);
offg.drawImage(Image1,50,50, 500,450, xpos, ypos,450+xpos,400+ypos ,this);
g.drawImage (offimg, 50, 50, this);
System.out.println ("w and h is" + w + " " + h + " and count update is" + " offg " +
offg);
}
}
public void paint(Graphics g)
{
if (first)
{
offimg = createImage (getWidth (), getHeight ());
offg = offimg.getGraphics ();
System.out.println ("w and h is" + w + " " + h + " and count update is" + " offg " +
offg);
first= false;
}
if (offg != null&&Image1!=null) //if delete this when the window state change,the image will not show
{ //you must scroll the bar by hand then it will show we show take care what the function of paint when repaint
offg.clearRect(50,50, 500,450);
offg.drawImage(Image1,50,50, 500,450, xpos, ypos,450+xpos,400+ypos ,this);
g.drawImage (offimg, 50, 50, this);
System.out.println ("w and h is" + w + " " + h + " and count update is" + " offg " +
offg);
}
System.out.println ("this is paint");
}
}//End of inner class.
}
本文地址:http://com.8s8s.com/it/it15200.htm