JscrollPane avec un SetLayout(null)

bmartinkle -  
KX Messages postés 19031 Statut Modérateur -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  2. bmartinkle
     
    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
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
  3. bmartinkle
     
    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
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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