JDK-4156773 : JViewport does not blit correctly when it is bigger than its subview.
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 1.1.6
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_nt
  • CPU: x86
  • Submitted: 1998-07-13
  • Updated: 1999-07-09
  • Resolved: 1999-07-09
Related Reports
Duplicate :  
Description
Example shows 'smudging' of a dragged image when backing store is 
enabled in the JViewport. 

Report and exmple due to David Geary. 

import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;

public class Test extends JApplet {
	public Test() {
		Container contentPane = getContentPane();
		JLabel label = new JLabel(new ImageIcon("pic.gif"));
		JViewport vp = new JViewport();
		ViewportDragListener listener = 
						new ViewportDragListener(vp);

		vp.setView(label);
		vp.addMouseListener(listener);
		vp.addMouseMotionListener(listener);

		contentPane.add(new ControlPanel(vp), BorderLayout.NORTH);
		contentPane.add(vp, BorderLayout.CENTER);
	}
}
class ControlPanel extends JPanel { 
	public ControlPanel(final JViewport vp) {
		JCheckBox cb = new JCheckBox("Backing Store Enabled");

		add(cb);

		cb.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				if(e.getStateChange() == ItemEvent.SELECTED)
					vp.setBackingStoreEnabled(true);
				else
					vp.setBackingStoreEnabled(false);
			}
		});
	}
}
class ViewportDragListener extends MouseAdapter
								implements MouseMotionListener {
	private JViewport viewport;
	private Point last = new Point(), scrollTo = new Point();

	public ViewportDragListener(JViewport viewport) {
		this.viewport = viewport;	
	}
	public void mousePressed(MouseEvent e) {
		last.x = e.getPoint().x;
		last.y = e.getPoint().y;
	}
	public void mouseMoved(MouseEvent e) {
	}
	public void mouseDragged(MouseEvent e) {
		Point drag = e.getPoint();
		Point viewPos = viewport.getViewPosition();
		Point offset = new Point(drag.x-last.x, drag.y-last.y);
		last.x = drag.x;
		last.y = drag.y;

		if(viewport.contains(drag)) {
			scrollTo.x = viewPos.x - offset.x;
			scrollTo.y = viewPos.y - offset.y;
			viewport.setViewPosition(scrollTo);
		}
	}
}

Comments
PUBLIC COMMENTS This was happening because viewport wasn't drawing in the background. Refer to 4237176 for more info. scott.violet@eng 1999-07-09
09-07-1999

EVALUATION This was happening because viewport wasn't drawing in the background. Refer to 4237176 for more info. scott.violet@eng 1999-07-09
09-07-1999