Partage
  • Partager sur Facebook
  • Partager sur Twitter

JScrollPane & liste d'images

Sujet résolu
    24 août 2015 à 5:55:02

    Bonjour,

    J'essaye d'afficher une liste d'images dans un JScrollPane. Cette liste est modifiée avec un listener sur une JTable.

    J'ai besoin de redimensionner mes images pour ne pas avoir quelque chose d'énorme, ce qui fonctionne plutôt bien. Ce qui ne fonctionne pas en revanche, c'est la JScrollPane qui ne crée pas les scrolls bars...

    Voici mon code :

    // Initialization
    panelPrevImg = new JPanel();
    panelPrevImg.setLayout(new BoxLayout(panelPrevImg, BoxLayout.X_AXIS));
    scrollPanePrevImg = new JScrollPane(panelPrevImg, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    panelParent.add(scrollPanePrevImg);
    
    panelParent.setMaximumSize(new Dimension(PANEL_WIDTH, 450));
    panelParent.setMinimumSize(new Dimension(PANEL_WIDTH, 450));
    
    // Listener
    for (BufferedImage img : selectedWeightedPath.getImages())
    	panelPrevImg.add(new PrevisualizationPanel(img));
    
    panelPrevImg.revalidate();
    scrollPanePrevImg.setViewportView(panelPrevImg);
    scrollPanePrevImg.revalidate();
    scrollPanePrevImg.repaint();
    panelParent.revalidate();
    

    Je poste le code de la classe PrevisualizationPanel au cas où, mais il fonctionne plutôt bien :

    public class PrevisualizationPanel extends JPanel {
        public static final int IMG_WIDTH = 400,
    			    IMG_HEIGHT = 400;
    	
        private Image img;
    	
        public PrevisualizationPanel(Image img) {
            BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = resizedImage.createGraphics();
            g.drawImage(img, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
            g.dispose();
    		
            this.img = resizedImage;
        }
    	
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.drawImage(img, 0, 0, IMG_WIDTH, IMG_HEIGHT, this);
        }
    }


    Mes images se chevauchent en largeur, et ne sont pas complètement affichées en hauteur. De plus je n'ai pas de scrolls bars...

    Je précise que j'ai déjà essayé avec le layout GridLayout sur panelPrevImg avec le même résultat.

    Mes recherches ne donnant rien, je me tourne vers vous.

    Merci,

    Maxime

    • Partager sur Facebook
    • Partager sur Twitter
    Pensez aux +1 lorsqu'on réponse vous a aidé et au "résolu" ;)
      24 août 2015 à 9:31:01

      Salut! J'ai été confronté au même genre de pb, et la solution que j'ai trouvé c'est de mettre ton panel d'image dans une JList et de créer un nouveau cellRenderer pour ta JList.

      Si tu as du mal à trouver la solution je peux te donner un exemple!

      • Partager sur Facebook
      • Partager sur Twitter
        25 août 2015 à 5:07:10

        Ok merci, effectivement ça fonctionne. J'avais vu l'idée, mais seulement pour des JLists composées d'icônes de textes.

        Je poste mon code pour ceux que ça intéresse. Donc je rappel que dans mon cas, je voulais afficher une liste d'images de taille fixe en fonction d'une sélection dans une JTable

        BufferedImage model[] = new BufferedImage[NB_IMAGES];
        JList<BufferedImage> imgList = new JList<>(model);
        imgList.setCellRenderer(new PrevCellRenderer());
        imgList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        imgList.setFixedCellWidth(PrevCellRenderer.IMG_WIDTH);
        imgList.setFixedCellHeight(PrevCellRenderer.IMG_HEIGHT);
        
        // Listener
        ImageListModel model = new ImageListModel();
        for (BufferedImage img : images)
        	model.add(img);
        
        prevImgList.setModel(model);
        public class PrevCellRenderer extends JPanel implements ListCellRenderer {
        	public static final int IMG_WIDTH = 400,
        				IMG_HEIGHT = 400;
        	
        	BufferedImage img;
        	
        	@Override
        	public Component getListCellRendererComponent(JList list, Object value,
        		      int index, boolean isSelected, boolean cellHasFocus) {
        		img = (BufferedImage) value;
        		BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
        		Graphics2D g = resizedImage.createGraphics();
        		g.drawImage(img, 0, 0, IMG_WIDTH, IMG_HEIGHT, this);
        		g.dispose();
        		
        		img = resizedImage;
        		
        		return this;
        	}	
        	
        	@Override
        	public void paint(Graphics g) {
        		super.paint(g);
        		g.drawImage(img, 0, 0, IMG_WIDTH, IMG_HEIGHT, this);
        		g.dispose();
        	}
        }
        public class ImageListModel extends AbstractListModel<BufferedImage> {
        	
        	private List<BufferedImage> data;		// The data of ListModel
        	
        	/** Constructor */
        	public ImageListModel() {
        		data = new ArrayList<BufferedImage>();
        	}
        	
        	/** Constructor with data
        	 * 
        	 * @param data : (List<BufferedImage>)
        	 */
        	public ImageListModel(List<BufferedImage> data) {
        		this.data = data;
        	}
        	
        	@Override
        	public BufferedImage getElementAt(int arg0) {
        		return data.get(arg0);
        	}
        
        	public void add(BufferedImage img) {
        		data.add(img);
        	}
        	
        	/** 
        	 * @param index : (int) index of data
        	 * @param img : (BufferedImage) new data
        	 */
        	public void setElementAt(int index, BufferedImage img) {
        		data.set(index, img);
        	}
        	
        	@Override
        	public int getSize() {
        		return data.size();
        	}
        		
        }

        Voilà encore merci :)

        Maxime


        -
        Edité par Max314 25 août 2015 à 5:07:38

        • Partager sur Facebook
        • Partager sur Twitter
        Pensez aux +1 lorsqu'on réponse vous a aidé et au "résolu" ;)
          25 août 2015 à 9:14:49

          Content d'avoir pu aider :')
          • Partager sur Facebook
          • Partager sur Twitter

          JScrollPane & liste d'images

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown