IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Redimensionner un JPanel dans un JScrollPane


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut Redimensionner un JPanel dans un JScrollPane
    Bonjour à tous,

    Je cherche à connaitre la taille utile d'un JPanel se trouvant dans un JScrollPane selon le redimensionnement que l'utilisateur donne à la JFrame. Le problème vient que le JPanel contient un JLabel avec du texte sur plusieurs lignes (utilisation des balises <html>). Du coup le nombre de lignes varie et la place nécessaire à l'affichage du JPanel varie également or la JScrollbar reste inchangé.

    Pour illustrer tout ça, voici un code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    import java.awt.Dimension;
     
     
     
    public class TestResize extends JFrame {
    	private JTextField textField;
     
    	public TestResize() {
    		super();
     
    		buildComponents();
    		pack();
    		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    		setLocationRelativeTo(null);
    	}
     
     
    	private void buildComponents() {
    		setPreferredSize(new Dimension(230,200));
     
    		JPanel mainPanel = new JPanel() {
    			protected void paintComponent(Graphics g) {
    				super.paintComponent(g);
    				System.out.println(getSize());
    			}
    		};
    		mainPanel.setBorder(new EtchedBorder());
    		JScrollPane jsp = new JScrollPane(mainPanel);
    		setContentPane(jsp);
    		GridBagLayout gbl_mainPanel = new GridBagLayout();
    		gbl_mainPanel.rowWeights = new double[]{0.0, 0.0, 1.0};
    		gbl_mainPanel.columnWeights = new double[]{0.0, 1.0};
    		mainPanel.setLayout(gbl_mainPanel);
     
    		JLabel lblTitre = new JLabel("Titre");
    		GridBagConstraints gbc_lblTitre = new GridBagConstraints();
    		gbc_lblTitre.gridwidth = 2;
    		gbc_lblTitre.insets = new Insets(0, 0, 5, 5);
    		gbc_lblTitre.gridx = 0;
    		gbc_lblTitre.gridy = 0;
    		mainPanel.add(lblTitre, gbc_lblTitre);
     
    		JLabel label1 = new JLabel("New label");
    		GridBagConstraints gbc_label1 = new GridBagConstraints();
    		gbc_label1.insets = new Insets(0, 0, 5, 5);
    		gbc_label1.anchor = GridBagConstraints.EAST;
    		gbc_label1.gridx = 0;
    		gbc_label1.gridy = 1;
    		mainPanel.add(label1, gbc_label1);
     
    		textField = new JTextField();
    		GridBagConstraints gbc_textField = new GridBagConstraints();
    		gbc_textField.insets = new Insets(0, 0, 5, 0);
    		gbc_textField.fill = GridBagConstraints.HORIZONTAL;
    		gbc_textField.gridx = 1;
    		gbc_textField.gridy = 1;
    		mainPanel.add(textField, gbc_textField);
    		textField.setColumns(10);
     
    		JLabel label2 = new JLabel("<html>JLabel contenant un texte trop long et qui pose problème lors du redimensionnement de l'IHM." +
    				" La JScrollbar verticale est encore affichée alors qu'il y a suffisament de place pour afficher tous les éléments du JPanel " +
    				"lorsqu'on agrandie la fenêtre horizontalement.</html>");
    		GridBagConstraints gbc_label2 = new GridBagConstraints();
    		gbc_label2.anchor = GridBagConstraints.NORTH;
    		gbc_label2.fill = GridBagConstraints.HORIZONTAL;
    		gbc_label2.gridwidth = 2;
    		gbc_label2.gridx = 0;
    		gbc_label2.gridy = 2;
    		mainPanel.add(label2, gbc_label2);
     
    		mainPanel.setPreferredSize(new Dimension(200,200));
    	}
     
    }
    Si je ne mets pas de setPreferredSize sur le mainPanel, le JLabel s'affiche sur une seule ligne.

    A part calculer la hauteur en additionnant la taille de certains composants, je ne vois pas comment faire... mais je ne trouve pas cette méthode très propre...

    Merci,

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le preferredSize de ton JLabel est toujours calculé en supposant qu'il dispose d'une largeur infinie. Comme ton texte ne comporte qu'une seule ligne, il aura un taille genre 2000x10.

    Ensuite le label rentre dans un composant. Ce composant tente de respecter le preferredSize, mais finit par lui imposer une taille en fonction de sa propre taille.
    Le JLabel tentera alors de s'afficher dans cette taille.

    Hors tu met ton JLabel dans un JScrollPane qui est par définition une surface infinie. Donc il occupera une seule ligne.

    Plusieurs solutions s'offrent à toi:

    Ajouter des br
    Retirer le JScrollPane
    Contraintre le JLabel via setPreferedSize/setMaximumSize

Discussions similaires

  1. Actualiser un JPanel dans un JScrollPane
    Par bingo06260 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 11/04/2011, 21h30
  2. JPanel dans un JScrollPane (qui ne défile pas bien)
    Par womannosky dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 11/02/2009, 09h16
  3. JPanel dans une JFrame ok, mais JPanel dans un JScrollPane dans une JFrame non :(
    Par FenX. dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 22/05/2008, 10h45
  4. Récupérer JPanel dans un JScrollPane dans un JTabbedPane
    Par orochimaru13 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/05/2008, 11h02
  5. [Swing] Un JPanel dans un JScrollPane
    Par Quintoff dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 08/01/2006, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo