Scrolling around a panel with no components
If a JPanel paints by drawing an off-screen buffered image and contains no
components, is it possible to scroll around the "content" (i.e. what's in
the buffer) by placing the panel in a JScrollPane? In the code that follows
I tried to do this but the scroll bars do not appear. The code renders a
red square that's bigger than the size of the panel and I'd like to be able
to use the scroll bars to scroll around to see the parts of the square which
are not initially visible.
Could someone show me what I need to add to provide the scrolling
functionality I require?
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Scrolling extends JFrame {
private class MyPanel extends JPanel {
private static final long serialVersionUID = -4135299933874896935L;
public MyPanel() {
this.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(final ComponentEvent e) {
Scrolling.this.buffer =
(BufferedImage)MyPanel.this.createImage(MyPanel.this.getWidth()
+ 100,
MyPanel.this.getHeight() + 100);
MyPanel.this.render();
}
});
}
@Override
public void paintComponent(final Graphics g) {
if (Scrolling.this.buffer != null) {
g.drawImage(Scrolling.this.buffer, 0, 0, null);
}
}
public void render() {
final Graphics2D g2d = Scrolling.this.buffer.createGraphics();
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(4f));
final Rectangle r =
new Rectangle(10, 10, Scrolling.this.buffer.getWidth() - 20,
Scrolling.this.buffer
.getHeight() - 20);
g2d.draw(r);
g2d.dispose();
}
}
private static final long serialVersionUID = -252113021932731092L;
private BufferedImage buffer;
public Scrolling() {
this.setLayout(new BorderLayout());
final MyPanel panel = new MyPanel();
final JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
this.add(scrollPane, BorderLayout.CENTER);
this.pack();
this.setSize(500, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new Scrolling().setVisible(true);
}
});
}
}
--
Regards,
Jarrick
------------------------------------
Jarrick.Chagma@your.mind.gmail.com
(Lose your mind before emailing me)