JscrollPane avec un SetLayout(null)

Fermé
bmartinkle - 2 mai 2013 à 16:49
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 2 mai 2013 à 21:02
Bonjour,
J'ai un petit soucis; mon application a pour but d'afficher une image dans un JPanel (qui est lui meme contenu dans un JPanel avec un Layout(null))
Cependant lorsque les images sont grandes, l'image n'est pas entièrement visible sur l'écran, c'est pourquoi j'aimerais mettre un JScrollPane mais cela ne fonctionne pas... Et dans mon projet, je suis obligé de garder un Layout(null)
Voila ce que j'ai essayé
JScrollPane pane = new JScrollPane(monCadre);
this.add(pane);


PS : monCadre étant le JPanel principal (celui qui contient le JPanel dans lequel s'affiche l'image).

Merci beaucoup



3 réponses

KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
2 mai 2013 à 19:11
Voici un exemple.

En rouge, tu as le Container de la JFrame (qui contient monCadre)
En bleu, c'est le JPanel monCadre.

Et en plein milieu, à l'intérieur de monCadre, tu as l'image avec ses barres.

import java.awt.Color;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Test
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setSize(500,500);
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.RED);
        
        JPanel monCadre = new JPanel();
        monCadre.setLayout(null);
        monCadre.setBackground(Color.BLUE);
        monCadre.setBounds(100,100,300,300);
        
        ImageIcon icon = new ImageIcon("C:/test.png");
        JLabel image = new JLabel(icon);
        image.setSize(icon.getIconWidth(),icon.getIconHeight());
        JScrollPane scroll = new JScrollPane(image);
        scroll.setBounds(100,100,100,100);        
        
        frame.add(monCadre);
        monCadre.add(scroll);
        
        frame.setVisible(true);
    }
}
0
Cependant, mon image s'affiche dans un JPanel, pas dans un JLabel; et je pense c'est pour ça que ton code ne fonctionne pas dans mon cas (je viens de l'essayer)
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
2 mai 2013 à 20:42
Là aussi l'image s'affiche dans un JPanel, je l'ai même colorié en bleu pour mieux le voir (et il a bien le setLayout à null comme tu le voulais...)

Après j'ai imbriqué un JScrollPane avec un JLabel et une ImageIcon, ça peut paraître compliqué, mais c'est le plus simple. En plus ça te permet d'utiliser ce que je t'indiquais hier pour utiliser les images quand elles sont stockées dans un JAR :

ImageIcon icon = new ImageIcon(Test.class.getResource("img/test.png"));
0
pourtant tu as écris :

"JScrollPane scroll = new JScrollPane(image);"
Or image est déclaré comme un JLabel.

Cependant moi mon image ne s'affiche sur un JLabel mais directement dans un JPanel... Je pense que c'est pour ça que cela ne fonctionne pas le JScrollPane.
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
2 mai 2013 à 21:02
Oui, image est un JLabel, je suis d'accord, mais c'est scroll que tu manipules au final puisque ce que tu veux c'est bien ça : un JScrollPane pour ton image...

Remarque : on pourrait "cacher" l'utilisation de ImageIcon et JLabel comme dans le code suivant, mais on ne va pas se mentir, c'est la même chose !

public static JScrollPane scrollableImage(String fileName)
{
	ImageIcon icon = new ImageIcon("C:/test.png");
        JLabel image = new JLabel(icon);
        image.setSize(icon.getIconWidth(),icon.getIconHeight());
        return new JScrollPane(image);
}

JScrollPane scroll = scrollableImage("C:/test.png");
scroll.setBounds(100,100,100,100);
monCadre.add(scroll);

Tu dis que ton image s'affiche "directement dans un JPanel" montre moi comment tu as fait, mais la meilleure manière de le faire je viens déjà de te la montrer...
0