Christophe Jacquet: Research and Teaching

Enseignement > Exemples en Java >

Swing : utilisation de JScrollPane

Dans une interface graphique, il est parfois nécessaire d'afficher des composants trop grands par rapport à la taille des fenêtres. Pour cela, on utilise un conteneur spécial, JScrollPane, qui dispose de barres de défilement. Cet exemple explique comment on peut utiliser un JScrollPane pour permettre l'affichage d'un grand composant personnalisé (par redéfinition de la méthode paintComponent).

/* ############################################################################
 * 
 * ScrollPaneTest.java : utilisation d'un composant JScrollPane pour le
 *                       défilement d'un grand composant Java, alors même que
 *                       ce grand composant est "personnalisé" (dessin avec
 *                       paintComponent())
 * 
 * Auteur : Christophe Jacquet, Supélec
 * 
 * Historique
 * 2007-04-02  Création
 * 
 * ############################################################################
 */

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;


/**
 * Cette classe ouvre une fenêtre (JFrame), dans laquelle se trouve un
 * JScrollPane qui permet de faire défiler un panneau personnalisé.
 */
public class ScrollPaneTest extends JFrame {
	private static final long serialVersionUID = 2859468497265768263L;

	public ScrollPaneTest() {
		super("Test ScrollPane");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		setLayout(new BorderLayout());
		add(new JScrollPane(new Panneau()), BorderLayout.CENTER);
		
		setPreferredSize(new Dimension(800, 600));
		pack();
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new ScrollPaneTest();
				frame.setVisible(true);
			}
		});
	}
}

/**
 * Panneau personnalisé d'une taille arbitraire,
 * qui se contente d'afficher un "motif"
 */
class Panneau extends JPanel {
	private static final long serialVersionUID = -3373703143308676581L;

	public Panneau() {
		// taille arbitraire
		setPreferredSize(new Dimension(2000, 1000));
	}

	/**
	 * Affichage du motif. Cela consiste à afficher les coordonnées de points
	 * régulièrement répartis sur le panneau.
	 */
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.BLUE);
		for(int x=0; x<getWidth(); x+=100)
			for(int y=0; y<getHeight(); y+=50)
				g.drawString(
						"(" + x + ", " + y + ")", 
						x, y + g.getFontMetrics().getHeight());
	}
}