Partage
  • Partager sur Facebook
  • Partager sur Twitter

JLabel dans JScrollPane avec GridLayout

Swing

    12 octobre 2008 à 7:18:48

    Bonjour à tous, j'ai besoin d'aide j'en peux plus :p

    Mise en situation :
    J'ai un JScrollPane dans un JPanel, jusque la rien de farfelu
    private JScrollPane scrollPane = new JScrollPane();
    private GridLayout gridLayout1 = new GridLayout();
    [...]
    this.add(scrollPane, null);
    scrollPane.setBounds(new Rectangle(280, 5, 645, 385));
    scrollPane.setBorder(BorderFactory.createTitledBorder("Current tileset"));
    gridLayout1.setColumns(4);
    scrollPane.getViewport().setLayout(gridLayout1);
    scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.black, 1));
    


    Ensuite je désire ajouter dynamiquement des JLabel dans mon JScrollPane.
    private Vector<JLabel> tiles = new Vector<JLabel>();
    [...]
    // avant ça je récupère un image avec fileChooser
    // je créé mon image pour appliquer sur un label
    ImageIcon image = new ImageIcon( fileChooser.getSelectedFile().getName() );
    // je store l'image
    map.addTile( fileChooser.getSelectedFile().getName(), image );
    // je créé un nouveau JLabel, je l'initialise et je l'ajoute dans mon vecteur de JLabel
    // les setSize et setPreferredSize ne sont, à priori, pas requis, mais je fait des test avec un peu tout la..
    JLabel newTile = new JLabel(image);
    newTile.setSize(map.getTileW(), map.getTileH());
    newTile.setPreferredSize(new Dimension(map.getTileW(), map.getTileH()));
    // une bordure pour constater l'espace que le JLabel prend
    newTile.setBorder(BorderFactory.createLineBorder(Color.black, 1));
    tiles.add(newTile);
    // j'ajoute mon JLabel dans mon JScrollPane
    scrollPane.getViewport().add(newTile, null);
    // repaint pour qu'il s'affiche
    repaint();
    


    Le problème, c'est que si j'ajoute plus d'un JLabel, le nouveau écrase l'ancien, alors on voit toujours seulement le plus récent.
    Pourtant c'est principalement l'utilité du gridlayout : je veux que chaque nouveau JLabel se place automatiquement dans la "grille", j'ai défini les colonnes à 4 et les rangées devrait scroller si y'en a trop...

    Image utilisateur

    Ici on voit que l'image prend toute la place (1px de border pour l'image et 1px pour le viewport du JScrollPane)... alors qu'elle devrait prendre qu'une case du gridlayout..

    Enfin, je sais plus quoi faire, si vous avez des pistes je suis preneur !

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2008 à 9:42:46

      Salut?
      Tu pourrais nous donner tout ton code qu'on puise tester STP ?
      Pour voir ce que tu fais et à quel moment...
      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2008 à 10:47:13

        Pourquoi utiliser des JLabels ? ce n'est pas plus simple de créer une classe qui hérite de JPanel et stocker les tuiles dans une matrice ? (je remercie mythrys pour m'avoir donné ce conseil qui m'a fait gagner beaucoup de temps lors de la création de mon propre éditeur de cartes)
        • Partager sur Facebook
        • Partager sur Twitter
          12 octobre 2008 à 20:24:31

          Citation : colibri

          Pourquoi utiliser des JLabels ? ce n'est pas plus simple de créer une classe qui hérite de JPanel et stocker les tuiles dans une matrice ? (je remercie mythrys pour m'avoir donné ce conseil qui m'a fait gagner beaucoup de temps lors de la création de mon propre éditeur de cartes)


          J'ai pris la solution qui m'a paru la plus simple, mais je crois que j vais essayer comme tu dis =)

          Citation : cysboy

          Salut?
          Tu pourrais nous donner tout ton code qu'on puise tester STP ?
          Pour voir ce que tu fais et à quel moment...


          Voila tout le code, si vous avez des commentaires sur différentes parties je suis ouvert à toutes suggestions :D
          Il y a probablement des trucs en trop (comme les imports, des variables ou des accesseurs non utilisées) que j'ai oublié d'enlever, n'y faite pas attention.

          FenetrePrincipal.java -> JFrame principal, il contient seulement un JMenu et un JTabbedPane (un pane pour chaque nouvelle map)
          package rpgmapeditor;
          
          import java.awt.Component;
          import java.awt.Dimension;
          
          import java.awt.Font;
          import java.awt.Graphics;
          import java.awt.Image;
          import java.awt.Insets;
          import java.awt.Rectangle;
          
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          
          
          import java.awt.event.KeyEvent;
          
          import java.util.Vector;
          
          import javax.swing.BorderFactory;
          import javax.swing.JButton;
          import javax.swing.JComboBox;
          import javax.swing.JDialog;
          import javax.swing.JFileChooser;
          import javax.swing.JFrame;
          import javax.swing.JLabel;
          import javax.swing.JList;
          import javax.swing.JMenu;
          import javax.swing.JMenuBar;
          import javax.swing.JMenuItem;
          import javax.swing.JOptionPane;
          import javax.swing.JPanel;
          import javax.swing.JScrollBar;
          import javax.swing.JSeparator;
          import javax.swing.JTabbedPane;
          import javax.swing.JTable;
          import javax.swing.JTextField;
          import javax.swing.JToolBar;
          import javax.swing.SwingConstants;
          import javax.swing.UIManager;
          import javax.swing.border.EtchedBorder;
          import javax.swing.filechooser.FileFilter;
          import javax.swing.table.DefaultTableModel;
          
          public class FenetrePrincipal extends JFrame
          {
          	private JMenuBar menuBar = new JMenuBar();
          	private JMenu menu = new JMenu("File");
          	private JMenuItem menuFileNew = new JMenuItem("New");
          	private JMenuItem menuFileOpen = new JMenuItem("Open");
          	private JMenuItem menuFileSave = new JMenuItem("Save");
          	private JMenuItem menuFileExit = new JMenuItem("Exit");
          	private JTabbedPane tabPane = new JTabbedPane();
          
          	public FenetrePrincipal()
          	{
          		try
          		{
          			jbInit();
          		}
          		catch (Exception e)
          		{
          			e.printStackTrace();
          		}
          	}
          
          	private void jbInit() throws Exception
          	{
          	    // Window stuff
          		this.getContentPane().setLayout(null);
          	    this.setSize(new Dimension(932, 733));
          	    this.setTitle("RPG Tiles Map Editor");
          		
          		// tabPane
          	    this.getContentPane().add(tabPane, null);
          		tabPane.setBounds(new Rectangle(0, 0, 925, 680));
          		
          		// Menu
          	    this.setJMenuBar(menuBar);
          		menu.add(menuFileNew);
          		menuFileNew.setMnemonic(KeyEvent.VK_N);
          		menu.add(menuFileOpen);
          		menu.add(menuFileSave);
          		menu.add(menuFileExit);
          		menuBar.add(menu);
          		
          		// création de la classe écouteur
          		Ecouteur e = new Ecouteur();
          		
          		// ajouter des sources pour la classe écouteur
          		menuFileNew.addActionListener(e);
          		menuFileExit.addActionListener(e);
          		
          	}
          	
          	private class Ecouteur implements ActionListener
          	{
          		public void actionPerformed(ActionEvent ae)
          		{
          			// Menu -> File -> New
          			if(ae.getSource() == menuFileNew)
          			{
          			    Map map = new Map();
          				PanelNewMap pnm = new PanelNewMap(FenetrePrincipal.this, map);
          				pnm.setVisible(true);
          				
          				
          			    tabPane.add(map.getName(), new PanelMapCreation(map));
          				tabPane.setSelectedComponent(tabPane.getComponentAt(tabPane.getTabCount()-1));
          			}
          			
          			// Menu -> File -> Exit
          			if(ae.getSource() == menuFileExit)
          			{
          			    System.exit(0);
          			}
          		} 
          	}
          
          	public static void main(String[] args)
          	{
          	    try 
          		{
          			String syslaf = UIManager.getSystemLookAndFeelClassName();
          			UIManager.setLookAndFeel(syslaf);
          		}
          		catch (Exception e)
          		{
          			e.printStackTrace();
          		}
          
          
          		FenetrePrincipal f = new FenetrePrincipal();
          		f.setVisible(true);
          		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
          	}
          }
          


          Map.java -> Classe qui définit une map, donc chaque nouveau panel de mon JTabbedPane instanci un objet Map
          package rpgmapeditor;
          
          import java.awt.Image;
          
          import java.io.File;
          
          import java.util.Hashtable;
          import java.util.Vector;
          
          import javax.swing.ImageIcon;
          
          public class Map
          {
          	private int tileW, tileH, width, height;
          	private String name;
          	private Vector<ImageIcon> tilesImage;
          	private Vector<String> tilesPath;
          	
          	public Map()
          	{
          	    name = "";
          	    tileW = 0;
          	    tileH = 0;
          	    width = 0;
          	    height = 0;
          		tilesImage = new Vector<ImageIcon>();
          		tilesPath = new Vector<String>();
          	}
          
          	public void setTileW(int tileW)
          	{
          		this.tileW = tileW;
          	}
          
          	public int getTileW()
          	{
          		return tileW;
          	}
          
          	public void setTileH(int tileH)
          	{
          		this.tileH = tileH;
          	}
          
          	public int getTileH()
          	{
          		return tileH;
          	}
          
          	public void setWidth(int mapW)
          	{
          		this.width = mapW;
          	}
          
          	public int getWidth()
          	{
          		return width;
          	}
          
          	public void setHeight(int mapH)
          	{
          		this.height = mapH;
          	}
          
          	public int getHeight()
          	{
          		return height;
          	}
          
          	public void setName(String mapName)
          	{
          		this.name = mapName;
          	}
          
          	public String getName()
          	{
          		return name;
          	}
          	
          	public void addTile(String path, ImageIcon tile)
          	{
          		tilesImage.add(tile);
          		tilesPath.add(path);
          	}
          	
          	public boolean tileIsNotPresent(String path)
          	{
          		boolean status = true;
          		for(int i=0; i<tilesImage.size(); i++)
          		{
          			if(tilesPath.elementAt(i).equals(path))
          			{
          				status = false;
          				i = tilesImage.size();
          			}
          		}
          		
          		return status;
          	}
          
          	public void setTilesPath(Vector<String> tilesPath)
          	{
          		this.tilesPath = tilesPath;
          	}
          
          	public Vector<String> getTilesPath()
          	{
          		return tilesPath;
          	}
          
          	public void setTilesImage(Vector<ImageIcon> tiles)
          	{
          		this.tilesImage = tiles;
          	}
          
          	public Vector<ImageIcon> getTilesImage()
          	{
          		return tilesImage;
          	}
          }
          


          PanelNewMap.java -> C'est une classe qui hérite de JDialog pour demander à l'utilisateur le nom, la taille des tiles et la taille de la map lors de la création d'une nouvelle map.
          package rpgmapeditor;
          
          import java.awt.Component;
          import java.awt.Dimension;
          import java.awt.Font;
          import java.awt.Insets;
          import java.awt.Rectangle;
          
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          
          import java.util.Vector;
          
          import javax.swing.JButton;
          import javax.swing.JComboBox;
          import javax.swing.JDialog;
          import javax.swing.JFrame;
          import javax.swing.JLabel;
          import javax.swing.JOptionPane;
          import javax.swing.JPanel;
          import javax.swing.JSeparator;
          import javax.swing.JTextField;
          import javax.swing.SwingConstants;
          
          public class PanelNewMap extends JDialog implements ActionListener
          {
          	private JLabel jLabel1 = new JLabel();
          	private JLabel jLabel2 = new JLabel();
          	private JTextField txtMapName = new JTextField("DefaultMap", 15);
          	private JTextField txtTileW = new JTextField("90", 3);
          	private JTextField txtTileH = new JTextField("60", 3);
          	private JLabel jLabel3 = new JLabel();
          	private JLabel jLabel4 = new JLabel();
          	private JSeparator jSeparator1 = new JSeparator();
          	private JTextField txtMapSizeW = new JTextField("64", 3);
          	private JTextField txtMapSizeH = new JTextField("64", 3);
          	private JLabel jLabel5 = new JLabel();
          	private JButton btnOk = new JButton("Ok");
          	private JButton btnCancel = new JButton("Cancel");
          	
          	private Component parent;
          	private Map map;
          
          	public PanelNewMap(JFrame parent, Map map)
          	{
          	    super();
          		this.parent = parent;
          		this.map = map;
          		
          		try
          		{
          			jbInit();
          		} catch(Exception e)
          		{
          			e.printStackTrace();
          		}
          	}
          
          	private void jbInit() throws Exception
          	{
          		this.setLayout( null );
          		this.setAlwaysOnTop(true);
          		this.setEnabled(true);
          	    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
          	    this.setLocationRelativeTo(parent);
          		this.setModal(true);
          		this.setResizable(false);
          		this.setTitle("Create a new map");
          		this.setSize(new Dimension(268, 201));
          		
          		jLabel1.setText("Map name :");
          	    jLabel1.setBounds(new Rectangle(15, 25, 65, 15));
          	    jLabel2.setText("Tiles size (W x H) :");
          	    jLabel2.setBounds(new Rectangle(15, 55, 110, 15));
          	    jLabel3.setText("X");
          	    jLabel3.setBounds(new Rectangle(180, 55, 15, 15));
          	    jLabel3.setFont(new Font("Dialog", 1, 12));
          	    jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
          	    jLabel4.setText("Map size (W x H) :");
          	    jLabel4.setBounds(new Rectangle(15, 100, 105, 15));
          	    jLabel5.setText("X");
          	    jLabel5.setBounds(new Rectangle(180, 100, 15, 15));
          	    jLabel5.setFont(new Font("Dialog", 1, 12));
          	    jLabel5.setHorizontalAlignment(SwingConstants.CENTER);
          		
          		txtMapName.setBounds(new Rectangle(125, 20, 125, 20));
          		txtMapName.setName("Map name");
          		txtMapName.requestFocus();
          	    
          		txtTileW.setBounds(new Rectangle(125, 50, 40, 20));
          	    txtTileW.setHorizontalAlignment(JTextField.CENTER);
          		txtTileW.setName("Tile width");
          		
          	    txtTileH.setBounds(new Rectangle(210, 50, 40, 20));
          	    txtTileH.setHorizontalAlignment(JTextField.CENTER);
          		txtTileH.setName("Tile height");
          		
          	    jSeparator1.setBounds(new Rectangle(15, 80, 235, 2));
          		
          	    txtMapSizeW.setBounds(new Rectangle(125, 95, 40, 20));
          	    txtMapSizeW.setHorizontalAlignment(JTextField.CENTER);
          		txtMapSizeW.setName("Map width");
          		
          	    txtMapSizeH.setBounds(new Rectangle(210, 95, 40, 20));
          	    txtMapSizeH.setHorizontalAlignment(JTextField.CENTER);
          		txtMapSizeH.setName("Map height");
          		
          	    btnOk.setBounds(new Rectangle(10, 130, 110, 30));
          	    btnCancel.setBounds(new Rectangle(140, 130, 110, 30));
          
          		this.add(btnCancel, null);
          		this.add(btnOk, null);
          		this.add(jLabel5, null);
          	    this.add(txtMapSizeH, null);
          	    this.add(txtMapSizeW, null);
          	    this.add(jSeparator1, null);
          	    this.add(jLabel4, null);
          	    this.add(jLabel3, null);
          	    this.add(txtTileH, null);
          	    this.add(txtTileW, null);
          	    this.add(txtMapName, null);
          	    this.add(jLabel2, null);
          	    this.add(jLabel1, null);
          		
          	    btnOk.addActionListener(this);
          	    btnCancel.addActionListener(this);
          	}
          
          	public void actionPerformed(ActionEvent ae)
          	{
          		if(ae.getSource() == btnOk)
          		{
          		    Vector<String> errors = new Vector<String>();
          
          			if(txtMapName.getText().equals(""))
          			{
          			    errors.add(txtMapName.getName() + "\n");
          			}
          		    if(txtTileW.getText().equals(""))
          		    {
          		        errors.add(txtTileW.getName() + "\n");
          		    }
          		    if(txtTileH.getText().equals(""))
          		    {
          		        errors.add(txtTileH.getName() + "\n");
          		    }
          		    if(txtMapSizeW.getText().equals(""))
          		    {
          		        errors.add(txtMapSizeW.getName() + "\n");
          		    }
          		    if(txtMapSizeH.getText().equals(""))
          		    {
          		        errors.add(txtMapSizeH.getName());
          		    }
          			
          			String message = "You forgot to fill these fields :\n";
          			for(int i=0; i<errors.size(); i++)
          			{
          				message+=errors.elementAt(i);
          			}
          			
          			if(errors.size() > 0)
          			{
          			    JOptionPane.showMessageDialog(PanelNewMap.this, message, "Imcomplete", JOptionPane.ERROR_MESSAGE);
          			}
          			else
          			{
          			    map.setName( txtMapName.getText() );
          			    map.setTileW( Integer.parseInt(txtTileW.getText()) );
          			    map.setTileH( Integer.parseInt(txtTileH.getText()) );
          			    map.setWidth( Integer.parseInt(txtMapSizeW.getText()) );
          			    map.setHeight( Integer.parseInt(txtMapSizeH.getText()) );
          			    this.dispose();
          			}
          		}
          		
          	    if(ae.getSource() == btnCancel)
          	    {
          	        this.dispose();
          	    }
          	}
          }
          


          PanelMapCreation.java -> C'est l'interface principal (le screenshot du premier post), lors de la création d'une nouvelle map, c'est un nouveau PanelMapCreation qui est ajouté comme panel à mon JTabbedPane.
          package rpgmapeditor;
          
          import java.awt.Color;
          import java.awt.Dimension;
          import java.awt.FlowLayout;
          import java.awt.Font;
          import java.awt.Graphics;
          import java.awt.GridBagLayout;
          import java.awt.GridLayout;
          import java.awt.Image;
          import java.awt.Insets;
          import java.awt.LayoutManager;
          import java.awt.Rectangle;
          
          import java.awt.Toolkit;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          
          import java.util.Vector;
          
          import javax.swing.BorderFactory;
          import javax.swing.ImageIcon;
          import javax.swing.JButton;
          import javax.swing.JComboBox;
          import javax.swing.JFileChooser;
          import javax.swing.JLabel;
          import javax.swing.JOptionPane;
          import javax.swing.JPanel;
          import javax.swing.JScrollPane;
          import javax.swing.JSeparator;
          import javax.swing.JTable;
          import javax.swing.JTextField;
          import javax.swing.SwingConstants;
          import javax.swing.table.DefaultTableModel;
          
          public class PanelMapCreation extends JPanel
          {
          	private JPanel Panel_MapSpecs = new JPanel();
          	private JLabel jLabel1 = new JLabel("Map name:");
          	private JLabel jLabel2 = new JLabel("Tiles size (W x H) :");
          	private JTextField txtMapName = new JTextField();
          	private JTextField txtTileW = new JTextField();
          	private JTextField txtTileH = new JTextField();
          	private JLabel jLabel3 = new JLabel("X");
          	private JLabel jLabel4 = new JLabel("Map size (W x H) :");
          	private JSeparator jSeparator1 = new JSeparator();
          	private JTextField txtMapSizeW = new JTextField();
          	private JTextField txtMapSizeH = new JTextField();
          	private JLabel jLabel5 = new JLabel("X");
          	private JButton btnAddTile = new JButton("Add tile...");
          	private JButton btnRemoveTile = new JButton("Remove tile");
          	private JScrollPane scrollPane = new JScrollPane();
          	private GridLayout gridLayout1 = new GridLayout();
          
          	// my variables
          	private JFileChooser fileChooser = new JFileChooser(".\\");
          	private Map map;
          	private Vector<JLabel> tiles = new Vector<JLabel>();
          
          
          	public PanelMapCreation(Map map)
          	{
          	    this.map = map;
          		
          		try
          		{
          			jbInit();
          		} catch(Exception e)
          		{
          			e.printStackTrace();
          		}
          	}
          
          	private void jbInit() throws Exception
          	{
          		this.setLayout( null );
          		this.setSize(new Dimension(939, 593));
          		this.add(scrollPane, null);
          		this.add(Panel_MapSpecs, null);
          
          
          		Panel_MapSpecs.setBounds(new Rectangle(5, 5, 265, 170));
          		Panel_MapSpecs.setBorder(BorderFactory.createTitledBorder("Map specifications"));
          		Panel_MapSpecs.setLayout(null);
          
          		jLabel1.setBounds(new Rectangle(15, 25, 65, 15));
          		jLabel2.setBounds(new Rectangle(15, 55, 110, 15));
          		jLabel3.setBounds(new Rectangle(180, 55, 15, 15));
          		jLabel3.setFont(new Font("Dialog", 1, 12));
          		jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
          		jLabel4.setBounds(new Rectangle(15, 100, 105, 15));
          		jLabel5.setBounds(new Rectangle(180, 100, 15, 15));
          		jLabel5.setFont(new Font("Dialog", 1, 12));
          		jLabel5.setHorizontalAlignment(SwingConstants.CENTER);
          
          		txtMapName.setBounds(new Rectangle(125, 20, 125, 20));
          		txtMapName.setText(map.getName());
          
          		txtTileW.setBounds(new Rectangle(125, 50, 40, 20));
          		txtTileW.setHorizontalAlignment(JTextField.CENTER);
          		txtTileW.setText(String.valueOf(map.getTileW()));
          
          		txtTileH.setBounds(new Rectangle(210, 50, 40, 20));
          		txtTileH.setHorizontalAlignment(JTextField.CENTER);
          		txtTileH.setText(String.valueOf(map.getTileH()));
          
          		jSeparator1.setBounds(new Rectangle(15, 80, 235, 2));
          
          		txtMapSizeW.setBounds(new Rectangle(125, 95, 40, 20));
          		txtMapSizeW.setHorizontalAlignment(JTextField.CENTER);
          		txtMapSizeW.setText(String.valueOf(map.getWidth()));
          
          		txtMapSizeH.setBounds(new Rectangle(210, 95, 40, 20));
          		txtMapSizeH.setHorizontalAlignment(JTextField.CENTER);
          		txtMapSizeH.setText(String.valueOf(map.getHeight()));
          
          		btnAddTile.setBounds(new Rectangle(15, 130, 110, 25));
          		btnAddTile.setMargin(new Insets(0, 0, 0, 0));
          		btnRemoveTile.setBounds(new Rectangle(135, 130, 115, 25));
          		btnRemoveTile.setMargin(new Insets(0, 0, 0, 0));
          
          		Panel_MapSpecs.add(btnRemoveTile, null);
          		Panel_MapSpecs.add(btnAddTile, null);
          		Panel_MapSpecs.add(jLabel5, null);
          		Panel_MapSpecs.add(txtMapSizeH, null);
          		Panel_MapSpecs.add(txtMapSizeW, null);
          		Panel_MapSpecs.add(jSeparator1, null);
          		Panel_MapSpecs.add(jLabel4, null);
          		Panel_MapSpecs.add(jLabel3, null);
          		Panel_MapSpecs.add(txtTileH, null);
          		Panel_MapSpecs.add(txtTileW, null);
          		Panel_MapSpecs.add(txtMapName, null);
          		Panel_MapSpecs.add(jLabel2, null);
          		Panel_MapSpecs.add(jLabel1, null);
          
          		// Panel Tiles
          		scrollPane.setBounds(new Rectangle(280, 5, 645, 385));
          	    scrollPane.setBorder(BorderFactory.createTitledBorder("Current tileset"));
          		gridLayout1.setColumns(4);
          		scrollPane.getViewport().setLayout(gridLayout1);
          	    scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.black, 1));
          	    
          
          		// Events management
          		Ecouteur e = new Ecouteur();
          		btnAddTile.addActionListener(e);
          		btnRemoveTile.addActionListener(e);
          	}
          
          	private class Ecouteur implements ActionListener
          	{
          		public void actionPerformed(ActionEvent ae)
          		{
          			// Button Add a tile...
          			if(ae.getSource() == btnAddTile)
          			{
          				int returnValue = fileChooser.showOpenDialog(PanelMapCreation.this);
          				
          				if(returnValue == JFileChooser.APPROVE_OPTION)
          				{
          					if( map.tileIsNotPresent( fileChooser.getSelectedFile().getName() ) )
          					{
          						ImageIcon image = new ImageIcon( fileChooser.getSelectedFile().getName() );
          						map.addTile( fileChooser.getSelectedFile().getName(), image );
          						
          						JLabel newTile = new JLabel(image);
          					    newTile.setSize(map.getTileW(), map.getTileH());
          						newTile.setPreferredSize(new Dimension(map.getTileW(), map.getTileH()));
          						newTile.setBorder(BorderFactory.createLineBorder(Color.black, 1));
          						tiles.add(newTile);
          						scrollPane.getViewport().add(newTile, null);
          						repaint();
          					}
          				}
          			}
          		} 
          	}
          }
          


          Voila, c'est "tout", c'est un peu pour être concis et ne pas trop encombré mon post que j'avais pas tout posté.

          Merci pour vos réponses =)
          • Partager sur Facebook
          • Partager sur Twitter
            13 octobre 2008 à 14:11:07

            je n'ai pas vu de this.setLayout() ?
            j'ai pas tout lu mais moi quand j'utilise les gridlayout je fais:

            monpanel.setLayout(new GridLayout(row, col));
            • Partager sur Facebook
            • Partager sur Twitter
              13 octobre 2008 à 14:27:53

              Daedric a raison, c'est sûrement un des problèmes...
              En plus, on ne peut pas mettre de GridLayout sur un JScrollPane...
              De mémoire, ce n'est pas permis... Ils doivent prendre un objet de type ScrollPaneLayout .

              Il faudrait que tu passe par un JPanel et que tu ajoute celui-ci à ton conteneur avec un JScrollPane genre :

              JPanel pan = new JPanel();
              pan.setLayout(monLayout);
              this.getContentPane().add(new JScrollPane(pan), BorderLayout.CENTER);
              
              • Partager sur Facebook
              • Partager sur Twitter
                13 octobre 2008 à 20:28:28

                Dans jbInit() de PanelMapCreation.java je fait :
                gridLayout1.setColumns(4);
                scrollPane.getViewport().setLayout(gridLayout1);
                

                En fait je met un gridLayout sur le Viewport du scrollPane, ainsi que j'ajoute mon label sur le viewport :
                scrollPane.getViewport().add(newTile, null);
                

                C'est la première fois que j'utilise les JScrollPane, je connais pas vraiment son fonctionnement (j'ai déduis que le viewport c'est la surface affiché).
                J'avais pas trop le temps hier, mais je vais testé plus en profondeur aujourd'hui.

                EDIT
                Bon j'ai trouvé un "bug" bizzare (problème de repaint je crois)...
                j'ai fait comme tu m'as proposé, j'ai créé un panel que j'ai donner à mon scrollpane comme viewport :
                // declarations
                private JPanel inViewport = new JPanel();
                private JScrollPane scrollPane = new JScrollPane(inViewport);
                private GridLayout gridLayout = new GridLayout();
                [...]
                // dans le constructeur
                scrollPane.setBounds(new Rectangle(280, 5, 645, 385));
                scrollPane.setBorder(BorderFactory.createTitledBorder("Current tiles"));
                gridLayout.setColumns(4);
                gridLayout.setHgap(5);
                gridLayout.setVgap(5);
                inViewport.setLayout(gridLayout);
                [...]
                // lors de l'ajout d'une tile via le bouton Add Tile
                ImageIcon image = new ImageIcon( fileChooser.getSelectedFile().getName() );
                map.addTile( fileChooser.getSelectedFile().getName(), image );
                
                JLabel newTile = new JLabel(image);
                newTile.setSize(map.getTileW(), map.getTileH());
                newTile.setPreferredSize(new Dimension(map.getTileW(), map.getTileH()));
                newTile.setBorder(BorderFactory.createLineBorder(Color.black, 1));
                tiles.add(newTile);
                inViewport.add(tiles.elementAt(tiles.size()-1), null);
                PanelMapCreation.this.repaint();
                

                Resultat:
                Etat initial :
                Image utilisateur
                Ouverture d'une premiere image, elle reste comme ca tant que je bouge pas mon curseur hors du panel ou que j'alt tab par exemple
                Image utilisateur
                Une fois que j'ai bouger mon curseur hors du panel (sur le menu par exemple), l'image se place au centre et prend toutes la place
                Image utilisateur
                si j'en ajoute un autre, meme chose
                Image utilisateur
                Image utilisateur
                au final ca continu de faire ca et y'a une barre de défilement horizontale pour toutes les images, mais j'ai spécifié seulement 4 colonnes dans le gridlayout... il devrais y avoir un défilement vertical et pas d'horizontal...
                • Partager sur Facebook
                • Partager sur Twitter
                  13 octobre 2008 à 22:44:33

                  4 colonnes ou 4 lignes ?
                  parce que si c'est bien 4 colonnes, tu commences à les avoir... :)
                  C'est peu être 4 lignes qu'il te faudrais !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 octobre 2008 à 0:14:20

                    non, j'ai fait gridLayout.setColumns(4);
                    donc je veux seulement 4 colonnes et les lignes en fonction du nombre d'images, donc avec une barre de défilement vertical.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 octobre 2008 à 10:25:33

                      J'aurais pas fait comme ca ...
                      avec ta maniere je peux pas t'aider ...

                      Edit:
                      mini typo
                      • Partager sur Facebook
                      • Partager sur Twitter

                      JLabel dans JScrollPane avec GridLayout

                      × 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