import java.rmi.*; import java.awt.*; import java.applet.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; public class ClientApplet extends JApplet { private RemoteServer remoteServer; private int x0Rect, x1Rect, y0Rect, y1Rect; private boolean picking = false; private double x0Real = -2, x1Real = 0.5, y0Real = -1.25, y1Real = 1.25; private Dimension d; private Image mi; private ThePanel panel = new ThePanel(); public void init() { String url = "rmi://" + getCodeBase().getHost() + "/"; try { remoteServer = (RemoteServer) Naming.lookup(url + "server2"); System.out.println("CURRENT BINDINGS:"); String[] bindings = Naming.list(""); for(int i = 0; i < bindings.length; i++) { System.out.println(bindings[i]); } } catch(Exception e) { System.out.println("Exception generated: "+ e.getMessage()); } getContentPane().add(BorderLayout.CENTER, panel); panel.addMouseListener(new MouseListener1()); panel.addMouseMotionListener(new MouseMotionListener1()); setSize(640, 400); } private Image updateImage() { try { int[] ia = remoteServer.updateImage(d, x0Real, x1Real, y0Real, y1Real); MemoryImageSource mis = new MemoryImageSource(d.width, d.height, ia, 0, d.width); return createImage(mis); } catch(Exception e) { System.out.println("Exception generated: "+ e.getMessage()); } return null; } private void updateXYReal() { double x0RealTmp = x0Real + (x1Real - x0Real) * (double)x0Rect / d.width; double x1RealTmp = x0Real + (x1Real - x0Real) * (double)x1Rect / d.width; double y0RealTmp = y0Real + (y1Real - y0Real) * (double)y0Rect / d.height; double y1RealTmp = y0Real + (y1Real - y0Real) * (double)y1Rect / d.height; x0Real = x0RealTmp; x1Real = x1RealTmp; y0Real = y0RealTmp; y1Real = y1RealTmp; } class ThePanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); if(!picking) { d = getSize(); mi = updateImage(); g.drawImage(mi, 0, 0, null); } else { g.drawImage(mi, 0, 0, null); g.setXORMode(Color.white); g.drawRect(x0Rect, y0Rect, Math.abs(x1Rect-x0Rect), Math.abs(y1Rect-y0Rect)); } } } class MouseListener1 extends MouseAdapter { public void mousePressed(MouseEvent e) { picking = true; x0Rect = e.getX(); y0Rect = e.getY(); } public void mouseReleased(MouseEvent e) { updateXYReal(); picking = false; panel.repaint(); } } class MouseMotionListener1 extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { x1Rect = e.getX(); y1Rect = e.getY(); panel.repaint(); } } }